Skip to content

Support running local agents#739

Merged
paul-nechifor merged 6 commits intodevfrom
local-agents
Dec 1, 2025
Merged

Support running local agents#739
paul-nechifor merged 6 commits intodevfrom
local-agents

Conversation

@paul-nechifor
Copy link
Contributor

@paul-nechifor paul-nechifor commented Nov 14, 2025

Ollama

Run an ollama model (qwen3:8b):

dimos-robot run --simulation unitree-go2-agentic-ollama

Ollama uses GGUF models. The above has been tested with tool calls and works.

Huggingface

Run a huggingface model (Qwen/Qwen2.5-1.5B-Instruct):

dimos-robot run --simulation unitree-go2-agentic-huggingface

Huggingface uses .safetensor. It doesn't seem to call tools. I should probably use a different model, but many in huggingface aren't quantized and use a lot of VRAM.

Greptile Overview

Greptile Summary

This PR adds support for running local AI agents using Ollama and HuggingFace models, enabling deployment without relying on cloud-based LLM providers.

Key Changes:

  • Added ollama_agent.py with utilities to check Ollama daemon availability and auto-pull missing models
  • Extended Agent.__init__ to handle Ollama and HuggingFace provider initialization with custom logic
  • Implemented blueprint requirement checks infrastructure to validate dependencies before execution
  • Added two new blueprint configurations: agentic_ollama (qwen3:8b) and agentic_huggingface (Qwen/Qwen2.5-1.5B-Instruct)
  • Included fallback logic to inject initial HumanMessage for LLMs that require at least one human message in history

Issues Found:

  • Missing ollama package dependency in pyproject.toml - the code imports ollama directly but only langchain-ollama is listed
  • Bare except handler in ollama_installed() could suppress unexpected errors

Confidence Score: 3/5

  • This PR is mostly safe but has a critical dependency issue that will cause runtime failures
  • The implementation is well-structured with proper error handling infrastructure (requirement checks), but the missing ollama package dependency will cause ModuleNotFoundError when users try to run Ollama-based agents. The bare except handler is a style issue but not critical. Once the missing dependency is added, this should work as intended.
  • Pay close attention to pyproject.toml - the missing ollama dependency will break functionality

Important Files Changed

File Analysis

Filename Score Overview
dimos/agents2/ollama_agent.py 4/5 New file with utility functions for checking Ollama availability and pulling models; bare except catches all exceptions
dimos/agents2/agent.py 4/5 Added Ollama and HuggingFace provider support with model initialization; includes fallback message for LLMs requiring human messages
dimos/core/blueprints.py 5/5 Added requirement checks infrastructure to validate dependencies before blueprint execution
dimos/robot/unitree_webrtc/unitree_go2_blueprints.py 5/5 Added agentic_ollama and agentic_huggingface blueprint configurations with proper requirement checks
dimos/robot/all_blueprints.py 5/5 Registered new blueprint names for local agent variants
pyproject.toml 4/5 Added dependencies for HuggingFace and Ollama LangChain integrations plus bitsandbytes for quantization

Sequence Diagram

sequenceDiagram
    participant User
    participant Blueprint as ModuleBlueprintSet
    participant Agent as Agent.__init__
    participant OllamaHelper as ollama_agent
    participant Ollama as Ollama Daemon
    participant HF as HuggingFace Pipeline
    participant LLM as LLM Instance

    User->>Blueprint: build(agentic_ollama/agentic_huggingface)
    Blueprint->>Blueprint: _check_requirements()
    alt Ollama Provider
        Blueprint->>OllamaHelper: ollama_installed()
        OllamaHelper->>Ollama: ollama.list()
        alt Connection Failed
            Ollama-->>OllamaHelper: Exception
            OllamaHelper-->>Blueprint: Error message
            Blueprint->>User: Print error & exit(1)
        else Success
            Ollama-->>OllamaHelper: Model list
            OllamaHelper-->>Blueprint: None (success)
        end
    end
    
    Blueprint->>Agent: Deploy Agent with config
    Agent->>Agent: __init__(provider, model)
    
    alt Ollama Provider
        Agent->>OllamaHelper: ensure_ollama_model(model_name)
        OllamaHelper->>Ollama: ollama.list()
        Ollama-->>OllamaHelper: Available models
        alt Model not found
            OllamaHelper->>Ollama: ollama.pull(model_name)
            Ollama-->>OllamaHelper: Model downloaded
        end
        Agent->>Agent: init_chat_model(ollama, model)
        Agent->>LLM: Create Ollama LLM instance
    else HuggingFace Provider
        Agent->>HF: HuggingFacePipeline.from_model_id()
        HF-->>Agent: Pipeline instance
        Agent->>LLM: ChatHuggingFace(llm=pipeline)
    else Other Provider
        Agent->>Agent: init_chat_model(provider, model)
    end
    
    LLM-->>Agent: LLM instance ready
    Agent->>Agent: agent_loop()
    
    alt No human messages in history
        Agent->>Agent: Append initial HumanMessage
        Note over Agent: "Everything is initialized..."
    end
    
    Agent->>LLM: invoke(messages)
    LLM-->>Agent: AI response
    Agent->>User: Agent operational
Loading

This was referenced Nov 14, 2025
Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@spomichter
Copy link
Contributor

THis is pretty nice I didnt realize langchain supports this like this

@spomichter
Copy link
Contributor

WHen i try and run dimos-robot run unitree-go2-agentic-ollama

│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_reached',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='explore_cmd',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='stop_explore_cmd',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_request',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.web.websocket_vis.websocket_vis_module.WebsocketVisModule'>,           │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='gps_location',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.mapping.types.LatLon'>,                                          │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='path',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.Path.Path'>,                                       │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_request',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='gps_goal',                                                                    │ │
│ │                      │   │   │   │   │   type=<class 'dimos.mapping.types.LatLon'>,                                          │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='explore_cmd',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='stop_explore_cmd',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='cmd_vel',                                                                     │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.Twist.Twist'>,                                │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='movecmd_stamped',                                                             │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>,                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.robot.foxglove_bridge.FoxgloveBridge'>,                                │ │
│ │                      │   │   │   connections=(),                                                                             │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.perception.spatial_perception.SpatialMemory'>,                         │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='color_image',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.perception.object_tracker.ObjectTracking'>,                            │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='color_image',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='depth',                                                                       │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='camera_info',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.sensor_msgs.CameraInfo.CameraInfo'>,                         │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='detection2darray',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.vision_msgs.Detection2DArray.Detection2DArray'>,            │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='detection3darray',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.vision_msgs.Detection3DArray.Detection3DArray'>,            │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='tracked_overlay',                                                             │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={'frame_id': 'camera_link'}                                                          │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ... +5                                                                                          │ │
│ │                      │   ),                                                                                                  │ │
│ │                      │   transport_map=mappingproxy({                                                                        │ │
│ │                      │   │   ('color_image', <class 'dimos.msgs.sensor_msgs.Image.Image'>):                                  │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x75798bffaf20>,                                           │ │
│ │                      │   │   ('camera_pose', <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>):                    │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x75798bffa5f0>,                                           │ │
│ │                      │   │   ('camera_info', <class 'dimos_lcm.sensor_msgs.CameraInfo.CameraInfo'>):                         │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x7579828b6980>                                            │ │
│ │                      │   }),                                                                                                 │ │
│ │                      │   global_config_overrides=mappingproxy({'n_dask_workers': 8, 'robot_model': 'unitree_go2'}),          │ │
│ │                      │   remapping_map=mappingproxy({})                                                                      │ │
│ │                      )                                                                                                       │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/dimos/core/blueprints.py:121 in _deploy_all_modules                                                │
│                                                                                                                                  │
│   118 │   │   │   sig = inspect.signature(blueprint.module.__init__)                                                             │
│   119 │   │   │   if "global_config" in sig.parameters:                                                                          │
│   120 │   │   │   │   kwargs["global_config"] = global_config                                                                    │
│ ❱ 121 │   │   │   module_coordinator.deploy(blueprint.module, *blueprint.args, **kwargs)                                         │
│   122 │                                                                                                                          │
│   123 │   def _connect_transports(self, module_coordinator: ModuleCoordinator) -> None:                                          │
│   124 │   │   # Gather all the In/Out connections with remapping applied.                                                        │
│                                                                                                                                  │
│ ╭─────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────╮ │
│ │          blueprint = ModuleBlueprint(                                                                                        │ │
│ │                      │   module=<class 'dimos.agents2.agent.LlmAgent'>,                                                      │ │
│ │                      │   connections=(),                                                                                     │ │
│ │                      │   args=(),                                                                                            │ │
│ │                      │   kwargs={'model': 'qwen3:8b', 'provider': <Provider.OLLAMA: 'ollama'>}                               │ │
│ │                      )                                                                                                       │ │
│ │      global_config = GlobalConfig(                                                                                           │ │
│ │                      │   robot_ip='192.168.9.140',                                                                           │ │
│ │                      │   simulation=False,                                                                                   │ │
│ │                      │   replay=False,                                                                                       │ │
│ │                      │   n_dask_workers=8,                                                                                   │ │
│ │                      │   mujoco_room=None,                                                                                   │ │
│ │                      │   robot_model='unitree_go2'                                                                           │ │
│ │                      )                                                                                                       │ │
│ │             kwargs = {'model': 'qwen3:8b', 'provider': <Provider.OLLAMA: 'ollama'>}                                          │ │
│ │ module_coordinator = <dimos.core.module_coordinator.ModuleCoordinator object at 0x757a99ce3b50>                              │ │
│ │               self = ModuleBlueprintSet(                                                                                     │ │
│ │                      │   blueprints=(                                                                                        │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.robot.unitree_webrtc.unitree_go2.ConnectionModule'>,                   │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='cmd_vel',                                                                     │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.Twist.Twist'>,                                │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='gps_location',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.mapping.types.LatLon'>,                                          │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='lidar',                                                                       │ │
│ │                      │   │   │   │   │   type=<class 'dimos.robot.unitree_webrtc.type.lidar.LidarMessage'>,                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='color_image',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='camera_info',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.sensor_msgs.CameraInfo.CameraInfo'>,                         │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='camera_pose',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.robot.unitree_webrtc.type.map.Map'>,                                   │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='lidar',                                                                       │ │
│ │                      │   │   │   │   │   type=<class 'dimos.robot.unitree_webrtc.type.lidar.LidarMessage'>,                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_map',                                                                  │ │
│ │                      │   │   │   │   │   type=<class 'dimos.robot.unitree_webrtc.type.lidar.LidarMessage'>,                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='local_costmap',                                                               │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={'voxel_size': 0.5, 'global_publish_interval': 2.5}                                  │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.navigation.global_planner.planner.AstarPlanner'>,                      │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='target',                                                                      │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='path',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.Path.Path'>,                                       │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class                                                                               │ │
│ │                      'dimos.navigation.local_planner.holonomic_local_planner.HolonomicLocalPlanner'>,                        │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='local_costmap',                                                               │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='path',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.Path.Path'>,                                       │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='cmd_vel',                                                                     │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.Twist.Twist'>,                                │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.navigation.bt_navigator.navigator.BehaviorTreeNavigator'>,             │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_request',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='target',                                                                      │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_reached',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='navigation_state',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.String.String'>,                                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class                                                                               │ │
│ │                      'dimos.navigation.frontier_exploration.wavefront_frontier_goal_selector.WavefrontFrontierExplorer'>,    │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_reached',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='explore_cmd',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='stop_explore_cmd',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_request',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.web.websocket_vis.websocket_vis_module.WebsocketVisModule'>,           │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='odom',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='gps_location',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.mapping.types.LatLon'>,                                          │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='path',                                                                        │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.Path.Path'>,                                       │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='global_costmap',                                                              │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.nav_msgs.OccupancyGrid.OccupancyGrid'>,                     │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='goal_request',                                                                │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>,                    │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='gps_goal',                                                                    │ │
│ │                      │   │   │   │   │   type=<class 'dimos.mapping.types.LatLon'>,                                          │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='explore_cmd',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='stop_explore_cmd',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.std_msgs.Bool.Bool'>,                                        │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='cmd_vel',                                                                     │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.Twist.Twist'>,                                │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='movecmd_stamped',                                                             │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.geometry_msgs.TwistStamped.TwistStamped'>,                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.robot.foxglove_bridge.FoxgloveBridge'>,                                │ │
│ │                      │   │   │   connections=(),                                                                             │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.perception.spatial_perception.SpatialMemory'>,                         │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='color_image',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={}                                                                                   │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ModuleBlueprint(                                                                                │ │
│ │                      │   │   │   module=<class 'dimos.perception.object_tracker.ObjectTracking'>,                            │ │
│ │                      │   │   │   connections=(                                                                               │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='color_image',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='depth',                                                                       │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='camera_info',                                                                 │ │
│ │                      │   │   │   │   │   type=<class 'dimos_lcm.sensor_msgs.CameraInfo.CameraInfo'>,                         │ │
│ │                      │   │   │   │   │   direction='in'                                                                      │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='detection2darray',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.vision_msgs.Detection2DArray.Detection2DArray'>,            │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='detection3darray',                                                            │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.vision_msgs.Detection3DArray.Detection3DArray'>,            │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   ),                                                                                      │ │
│ │                      │   │   │   │   ModuleConnection(                                                                       │ │
│ │                      │   │   │   │   │   name='tracked_overlay',                                                             │ │
│ │                      │   │   │   │   │   type=<class 'dimos.msgs.sensor_msgs.Image.Image'>,                                  │ │
│ │                      │   │   │   │   │   direction='out'                                                                     │ │
│ │                      │   │   │   │   )                                                                                       │ │
│ │                      │   │   │   ),                                                                                          │ │
│ │                      │   │   │   args=(),                                                                                    │ │
│ │                      │   │   │   kwargs={'frame_id': 'camera_link'}                                                          │ │
│ │                      │   │   ),                                                                                              │ │
│ │                      │   │   ... +5                                                                                          │ │
│ │                      │   ),                                                                                                  │ │
│ │                      │   transport_map=mappingproxy({                                                                        │ │
│ │                      │   │   ('color_image', <class 'dimos.msgs.sensor_msgs.Image.Image'>):                                  │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x75798bffaf20>,                                           │ │
│ │                      │   │   ('camera_pose', <class 'dimos.msgs.geometry_msgs.PoseStamped.PoseStamped'>):                    │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x75798bffa5f0>,                                           │ │
│ │                      │   │   ('camera_info', <class 'dimos_lcm.sensor_msgs.CameraInfo.CameraInfo'>):                         │ │
│ │                      <dimos.core.transport.LCMTransport object at 0x7579828b6980>                                            │ │
│ │                      │   }),                                                                                                 │ │
│ │                      │   global_config_overrides=mappingproxy({'n_dask_workers': 8, 'robot_model': 'unitree_go2'}),          │ │
│ │                      │   remapping_map=mappingproxy({})                                                                      │ │
│ │                      )                                                                                                       │ │
│ │                sig = <Signature (self, *args, **kwargs) -> None>                                                             │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/dimos/core/module_coordinator.py:55 in deploy                                                      │
│                                                                                                                                  │
│   52 │   │   if not self._client:                                                                                                │
│   53 │   │   │   raise ValueError("Not started")                                                                                 │
│   54 │   │                                                                                                                       │
│ ❱ 55 │   │   module = self._client.deploy(module_class, *args, **kwargs)                                                         │
│   56 │   │   self._deployed_modules[module_class] = module                                                                       │
│   57 │   │   return module                                                                                                       │
│   58                                                                                                                             │
│                                                                                                                                  │
│ ╭────────────────────────────────────── locals ───────────────────────────────────────╮                                          │
│ │   args = ()                                                                         │                                          │
│ │ kwargs = {'model': 'qwen3:8b', 'provider': <Provider.OLLAMA: 'ollama'>}             │                                          │
│ │   self = <dimos.core.module_coordinator.ModuleCoordinator object at 0x757a99ce3b50> │                                          │
│ ╰─────────────────────────────────────────────────────────────────────────────────────╯                                          │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/dimos/core/__init__.py:100 in deploy                                                               │
│                                                                                                                                  │
│    97 │   │   │   │   *args,                                                                                                     │
│    98 │   │   │   │   **kwargs,                                                                                                  │
│    99 │   │   │   │   actor=True,                                                                                                │
│ ❱ 100 │   │   │   ).result()                                                                                                     │
│   101 │   │   │                                                                                                                  │
│   102 │   │   │   worker = actor.set_ref(actor).result()                                                                         │
│   103 │   │   │   print(f"deployed: {colors.blue(actor)} @ {colors.orange('worker ' + str(work                                   │
│                                                                                                                                  │
│ ╭───────────────────────────────────────── locals ─────────────────────────────────────────╮                                     │
│ │        args = ()                                                                         │                                     │
│ │     console = <console width=132 ColorSystem.TRUECOLOR>                                  │                                     │
│ │ dask_client = <Client: 'tcp://127.0.0.1:35279' processes=8 threads=32, memory=31.01 GiB> │                                     │
│ │      kwargs = {'model': 'qwen3:8b', 'provider': <Provider.OLLAMA: 'ollama'>}             │                                     │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────╯                                     │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/local-venv/lib/python3.10/site-packages/distributed/client.py:392 in result                        │
│                                                                                                                                  │
│    389 │   │   """                                                                                                               │
│    390 │   │   self._verify_initialized()                                                                                        │
│    391 │   │   with shorten_traceback():                                                                                         │
│ ❱  392 │   │   │   return self.client.sync(self._result, callback_timeout=timeout)                                               │
│    393 │                                                                                                                         │
│    394 │   async def _result(self, raiseit=True):                                                                                │
│    395 │   │   await self._state.wait()                                                                                          │
│                                                                                                                                  │
│ ╭─────────────────────────────────── locals ────────────────────────────────────╮                                                │
│ │    self = <Future: error, key: LlmAgent-8a3699f8-c2d5-4aa4-a0b2-bf10f091118c> │                                                │
│ │ timeout = None                                                                │                                                │
│ ╰───────────────────────────────────────────────────────────────────────────────╯                                                │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/dimos/agents2/agent.py:207 in __init__                                                             │
│                                                                                                                                  │
│   204 │   │   else:                                                                                                              │
│   205 │   │   │   # For Ollama provider, ensure the model is available before initializing                                       │
│   206 │   │   │   if self.config.provider.value.lower() == "ollama":                                                             │
│ ❱ 207 │   │   │   │   _ensure_ollama_model(self.config.model)                                                                    │
│   208 │   │   │                                                                                                                  │
│   209 │   │   │   # For HuggingFace, we need to create a pipeline and wrap it in ChatHuggingFa                                   │
│   210 │   │   │   if self.config.provider.value.lower() == "huggingface":                                                        │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/dimos/agents2/agent.py:165 in _ensure_ollama_model                                                 │
│                                                                                                                                  │
│   162                                                                                                                            │
│   163                                                                                                                            │
│   164 def _ensure_ollama_model(model_name: str) -> None:                                                                         │
│ ❱ 165 │   available_models = ollama.list()                                                                                       │
│   166 │   model_exists = any(model_name == m.model for m in available_models.models)                                             │
│   167 │   if not model_exists:                                                                                                   │
│   168 │   │   logger.info(f"Ollama model '{model_name}' not found. Pulling...")                                                  │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/local-venv/lib/python3.10/site-packages/ollama/_client.py:604 in list                              │
│                                                                                                                                  │
│    601 │   return digest                                                                                                         │
│    602                                                                                                                           │
│    603   def list(self) -> ListResponse:                                                                                         │
│ ❱  604 │   return self._request(                                                                                                 │
│    605 │     ListResponse,                                                                                                       │
│    606 │     'GET',                                                                                                              │
│    607 │     '/api/tags',                                                                                                        │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/local-venv/lib/python3.10/site-packages/ollama/_client.py:189 in _request                          │
│                                                                                                                                  │
│    186 │                                                                                                                         │
│    187 │     return inner()                                                                                                      │
│    188 │                                                                                                                         │
│ ❱  189 │   return cls(**self._request_raw(*args, **kwargs).json())                                                               │
│    190                                                                                                                           │
│    191   @overload                                                                                                               │
│    192   def generate(                                                                                                           │
│                                                                                                                                  │
│ /home/stash/dimensional/dimos/local-venv/lib/python3.10/site-packages/ollama/_client.py:135 in _request_raw                      │
│                                                                                                                                  │
│    132 │   except httpx.HTTPStatusError as e:                                                                                    │
│    133 │     raise ResponseError(e.response.text, e.response.status_code) from None                                              │
│    134 │   except httpx.ConnectError:                                                                                            │
│ ❱  135 │     raise ConnectionError(CONNECTION_ERROR_MESSAGE) from None                                                           │
│    136                                                                                                                           │
│    137   @overload                                                                                                               │
│    138   def _request(                                                                                                           │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ConnectionError: Failed to connect to Ollama. Please check that Ollama is downloaded, running and accessible. 
https://ollama.com/download
/usr/lib/python3.10/multiprocessing/resource_tracker.py:224: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '

@paul-nechifor
Copy link
Contributor Author

ConnectionError: Failed to connect to Ollama. Please check that Ollama is downloaded, running and accessible.
https://ollama.com/download

@spomichter That error is expected. ollama needs to be installed on the system. My plan was to add how to install it in the docs, but it's a bit unclear currently where to add such info.

Should I catch the exception and print how to install it?

@spomichter
Copy link
Contributor

Yeah that would be helpful @paul-nechifor

@paul-nechifor
Copy link
Contributor Author

Yeah that would be helpful @paul-nechifor

I've added a check for ollama:

2025-11-18_05-19

leshy

This comment was marked as outdated.

Copy link
Contributor

@leshy leshy left a comment

Choose a reason for hiding this comment

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

2025-11-19_19-52 we are good, just general issues unrelated to local agents (I used --replay and I guess doesn't work with commands, and not passing errors down to agent, pretends it was successful)

leshy
leshy previously approved these changes Nov 19, 2025
@spomichter
Copy link
Contributor

@greptile

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

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

6 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@paul-nechifor paul-nechifor merged commit dd57f15 into dev Dec 1, 2025
12 checks passed
leshy pushed a commit that referenced this pull request Jan 5, 2026
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6
spomichter pushed a commit that referenced this pull request Jan 8, 2026
Support running local agents

Former-commit-id: dd57f15
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 26e61a70a9469f2e33e51f1296f082b470009c09 [formerly 7ffc878]
Former-commit-id: 725e628
spomichter pushed a commit that referenced this pull request Jan 8, 2026
Support running local agents

Former-commit-id: c09862b
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 7ffc878
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 7ffc878
Former-commit-id: 067332a
spomichter pushed a commit that referenced this pull request Jan 8, 2026
Support running local agents

Former-commit-id: 4d5c6a4 [formerly c09862b]
Former-commit-id: 1b4f398
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 26e61a70a9469f2e33e51f1296f082b470009c09 [formerly 7ffc878]
Former-commit-id: 725e628
Former-commit-id: 2e5f1d4
spomichter pushed a commit that referenced this pull request Jan 8, 2026
Support running local agents

Former-commit-id: 4d5c6a4 [formerly c09862b]
Former-commit-id: 1b4f398
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 7ffc878
Former-commit-id: 067332a
spomichter added a commit that referenced this pull request Jan 8, 2026
Release v0.0.6: Pre-Launch Unitree Go2 Release

## What's Changed
* Added is_flying_to_target agent skill and fly_to now return string for agent feeback by @spomichter in #635
* Release v0.0.5 by @spomichter in #697
* Rebase ivan g1 by @paul-nechifor in #709
* Navspec by @leshy in #648
* Remove depth module from base unitree go2 blueprints by @spomichter in #712
* Fix Unitree Go2 (replay and spatial memory) by @paul-nechifor in #714
* Add G1 blueprints, and simulation by @paul-nechifor in #724
* New g1 blueprint runfiles by @spomichter in #706
* Update G1/Go2 skills and remove some Robot interfaces by @paul-nechifor in #717
* Add dimos-robot end-to-end test with agents by @paul-nechifor in #716
* Run DimOS and ROS nav in Docker by @paul-nechifor in #700
* Anim experiment by @leshy in #701
* G1 navigation documentation fixes by @spomichter in #738
* Rename dimos-robot to dimos by @paul-nechifor in #740
* Use a process for MuJoCo by @paul-nechifor in #747
* Remove unneeded code files by @paul-nechifor in #718
* Make pygame G1JoystickModule usable for all modules by @paul-nechifor in #741
* error on conflicts by @paul-nechifor in #763
* Hosted Moondream 3 for VLM queries by @alexlin2 in #751
* transport: Remove DaskTransport dead code by @ym-han in #767
* Add editorconfig by @paul-nechifor in #769
* add `type: ignore` by @paul-nechifor in #768
* exclude .md changes from CICD builds by @spomichter in #770
* Working Ivan g1 detection in blueprints by @spomichter in #737
* small env fixes on a fresh install by @leshy in #778
* autofixes by @paul-nechifor in #744
* Support running local agents by @paul-nechifor in #739
* pin major version of langchain packages by @paul-nechifor in #789
* Deduplicate Unitree connections/entrypoints. by @paul-nechifor in #749
* Add TTS and STT by @paul-nechifor in #753
* fix mypy errors by @paul-nechifor in #791
* Use structlog and store JSON logs on disk by @paul-nechifor in #715
* Rpc fixes merge by @paul-nechifor in #801
* transport improvements by @leshy in #713
* Added concurrency check by @spomichter in #803
* make connections work with string annotations by @paul-nechifor in #807
* Run mypy checks in GitHub Actions by @paul-nechifor in #805
* Fix incorrect `= None` by @paul-nechifor in #802
* increase mujoco timeout by @paul-nechifor in #823
* MacOS Support: tests + devShell + mujoco by @jeff-hykin in #745
* nix flake revert by @leshy in #824
* fix mypy issues by @paul-nechifor in #827
* PRODUCTION Nav skills on drone with tracking by @spomichter in #640
* Fix added memory limit to blueprint global config by @spomichter in #856
* models/ refactor by @leshy in #819
* Point Detections by @leshy in #859
* Add generic ignore to gitignore by @jeff-hykin in #864
* fix set transport by @paul-nechifor in #866
* cli-precedence by @paul-nechifor in #857
* show `get_data` progress by @paul-nechifor in #873
* skip if OPENAI_API_KEY not defined by @paul-nechifor in #872
* build foxglove extension by @paul-nechifor in #871
* New planner by @paul-nechifor in #792
* Use `uv` by @paul-nechifor in #870
* Add direnv to gitignore by @Kaweees in #875
* Cuda mapper by @leshy in #862
* rename agents to agents_deprecated by @paul-nechifor in #877
* new planner new mapper by @paul-nechifor in #879
* odom ts parsing by @leshy in #882
* Sim fix by @paul-nechifor in #881
* navigation tuning by @leshy in #883
* Fix: Module init and agents by @leshy in #876
* Remove old setup.sh by @paul-nechifor in #888
* Release planner by @leshy in #887
* fix replay leak by @paul-nechifor in #890
* first pass on large file deletions by @leshy in #891
* Generalized manipulator driver by @mustafab0 in #831
* Restore MacOS Support (flake.nix) by @jeff-hykin in #863
* check-uv by @paul-nechifor in #902
* Make dimos pip-installable by @paul-nechifor in #731
* Revert "Restore MacOS Support (flake.nix)" by @leshy in #907
* jeff flake without py env stuff by @leshy in #911
* remove deprecated docker files by @paul-nechifor in #912
* command center stop and home by @leshy in #893
* use packages by @paul-nechifor in #915
* Fix agents prompt by @paul-nechifor in #914
* fix manifest by @paul-nechifor in #916
* fix move skill by @paul-nechifor in #913
* Ignore individual errors by @paul-nechifor in #919
* Feat/rerun latency panels by @Nabla7 in #917
* WIP Release detections by @leshy in #889
* Remove old navigation modules by @paul-nechifor in #923
* Feat/rerun latency panels by @Nabla7 in #925
* Repair camera module by @leshy in #929
* Repair Stream by @leshy in #932
* Docs Clean by @leshy in #933
* docs: sensor streams by @leshy in #934
* Docs: bugfixes by @leshy in #940
* Fixed doclinks to use git ls by @spomichter in #943
* Examples: third party language interop by @leshy in #946
* DOCS: temporal alignment docs improvements by @leshy in #944
* filter bots from commits by @leshy in #947
* Fix skills by @paul-nechifor in #950
* Limit Rerun viewer memory to 4GB default by @Nabla7 in #949
* Working dimensional MCP server - tested with Claude Code MCP client by @spomichter in #945
* allow registration of different agents by @paul-nechifor in #951
* Pre commit large files by @leshy in #953
* Proper Realsense and ZED Camera Drivers by @alexlin2 in #935
* Granular deps by @leshy in #894
* class VLMAgent(AgentSpec, Module) for streamed VLM queries over Transport by @spomichter in #960
* mac compatible commit filter by @paul-nechifor in #961

## New Contributors
* @ym-han made their first contribution in #767
* @jeff-hykin made their first contribution in #745
* @Kaweees made their first contribution in #875
* @mustafab0 made their first contribution in #831
* @Nabla7 made their first contribution in #917

**Full Changelog**: v0.0.5...v0.0.6

Former-commit-id: 26e61a70a9469f2e33e51f1296f082b470009c09 [formerly 7ffc878]
Former-commit-id: 725e628
Former-commit-id: 2e5f1d4
paul-nechifor added a commit that referenced this pull request Jan 8, 2026
Support running local agents

Former-commit-id: ecc9401 [formerly dd57f15]
Former-commit-id: 1d2edcd
jeff-hykin pushed a commit that referenced this pull request Jan 9, 2026
Support running local agents

Former-commit-id: 43512ea [formerly dd57f15]
Former-commit-id: 1d2edcd
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.

3 participants