Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
72b0115
Module config tweaks (#1510)
Dreamsorcerer Mar 12, 2026
482bfcf
chore(comments): remove section markers (#1546)
paul-nechifor Mar 14, 2026
5135566
fix(imports): remove dunder init (#1545)
paul-nechifor Mar 14, 2026
eef0230
fix(deps): skip pyrealsense2 on macOS (#1556)
jeff-hykin Mar 14, 2026
e1bc7f1
Feat/memory2 (#1536)
leshy Mar 15, 2026
8ae82f4
docs(readme): add Trendshift trending badge (#1563)
spomichter Mar 15, 2026
30f8e58
fix(ci): limit tests to 60 minutes max (#1557)
paul-nechifor Mar 16, 2026
01af6b2
fix(old-scripts): remove (#1561)
paul-nechifor Mar 16, 2026
a499eac
docs: add Spec issue template (#1574)
spomichter Mar 16, 2026
73b06c9
feat(patrol): add patrolling module (#1488)
paul-nechifor Mar 17, 2026
c0692bf
fix: rename teleop blueprints, remove VisualizingTeleopModule (#1602)
ruthwikdasyam Mar 19, 2026
a0f0fa7
feat(test): add leaderboard (#1580)
paul-nechifor Mar 19, 2026
00cdcc4
fix(florence): fix text failure (#1582)
paul-nechifor Mar 19, 2026
9ea24bb
event based sub callback collector for tests (#1605)
leshy Mar 19, 2026
4d0d260
refactor: split control blueprints + added env variables (#1601)
ruthwikdasyam Mar 19, 2026
c50d033
- (#1610)
jeff-hykin Mar 19, 2026
aed901f
fix(cli): fix `dimos --help` (both bad imports and speed) (#1571)
jeff-hykin Mar 20, 2026
c7f8fef
chore(blueprints): remove aliases (#1606)
paul-nechifor Mar 20, 2026
660b782
Merge branch 'main' into dev
spomichter Mar 21, 2026
0d7faef
Feature: go2 webrtc TwistBase adapter for control coordinator (#1362)
mustafab0 Mar 21, 2026
c437236
data: add sim assets for xArm6 and Piper (#1642)
ruthwikdasyam Mar 21, 2026
bac5842
MuJoCo sim support for Manipulation (#1639)
ruthwikdasyam Mar 22, 2026
6b42471
fix: use typing_extensions.Self for Python 3.10 compat (#1621)
jeff-hykin Mar 22, 2026
2aa3f3a
chore: close stale prs (#1646)
paul-nechifor Mar 23, 2026
38acf8d
Dimos Unity Simulator (#1539)
jeff-hykin Mar 24, 2026
2aeb975
chore(agents): remove non-mcp version (#1657)
paul-nechifor Mar 24, 2026
8f137fe
feat(ci): add macOS CI runners for mypy + tests (DIM-696) (#1482)
spomichter Mar 24, 2026
306ccff
vis kickstart (#1637)
leshy Mar 25, 2026
afb35a7
make unity sim tests deterministic (#1681)
jeff-hykin Mar 26, 2026
0eb71f3
Working manipulation demo after recent dev changes (#1656)
mustafab0 Mar 26, 2026
cd5bcd5
Ruthwik/rerun bg (#1690)
ruthwikdasyam Mar 27, 2026
d912a30
Docker Restoration and Fixes (#1431)
jeff-hykin Mar 27, 2026
9d78066
chore(rpc): remove old rpc linking (#1696)
paul-nechifor Mar 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
28 changes: 28 additions & 0 deletions .github/ISSUE_TEMPLATE/spec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Spec
description: Technical specification for a new module, feature, or system change
title: "[Spec]: "
body:
- type: textarea
id: spec
attributes:
label: Specification
description: Full technical spec in markdown
value: |
## Summary
<!-- One sentence: what this adds/changes and why -->

## Motivation
<!-- What problem does this solve? Link related issues. -->

## Design

### API / Interface
<!-- Public API, CLI flags, stream types, config options -->

### Architecture
<!-- How it fits into DimOS. Which modules, streams, blueprints are involved? -->

### Implementation Notes
<!-- Key decisions, algorithms, dependencies, constraints -->
validations:
required: true
125 changes: 125 additions & 0 deletions .github/workflows/macos.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
name: macos

on:
push:
branches:
- main
- dev
paths-ignore:
- '**.md'
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths-ignore:
- '**.md'
- 'docker/**'
- '.github/workflows/docker.yml'
- '.github/workflows/_docker-build-template.yml'

permissions:
contents: read

jobs:
check-changes:
if: github.event_name != 'pull_request' || github.event.pull_request.draft == false
runs-on: ubuntu-latest
outputs:
should-run: ${{ steps.filter.outputs.python }}
steps:
- uses: actions/checkout@v4
- id: filter
uses: dorny/paths-filter@v3
with:
filters: |
python:
- 'dimos/**'
- 'pyproject.toml'
- 'uv.lock'
- '.github/workflows/macos.yml'

macos-tests:
needs: [check-changes]
if: needs.check-changes.outputs.should-run == 'true'
runs-on: [self-hosted, macos, arm64]
timeout-minutes: 60
steps:
- uses: actions/checkout@v4
with:
lfs: false

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true

- name: Set up Python
run: uv python install 3.12

- name: Install system dependencies
run: brew install gnu-sed gcc portaudio git-lfs libjpeg-turbo

- name: Set up git-lfs
run: |
git lfs install
git lfs pull

- name: Install dependencies
run: |
uv sync --all-extras --no-extra dds --no-extra cuda --frozen

- name: Check disk usage
run: |
df -h .
du -sh .venv/ || true

- name: Configure LCM networking
run: |
# Same as dimos autoconf for macOS (skipped when CI=1)
sudo route add -net 224.0.0.0/4 -interface lo0 || true
sudo sysctl -w kern.ipc.maxsockbuf=6291456
sudo sysctl -w net.inet.udp.recvspace=2097152
sudo sysctl -w net.inet.udp.maxdgram=65535

- name: Run tests
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
ALIBABA_API_KEY: ${{ secrets.ALIBABA_API_KEY }}
LCM_DEFAULT_URL: "udpm://239.255.76.67:7667?ttl=0"
CI: "1"
run: |
source .venv/bin/activate
python -m pytest --durations=10 -m 'not (tool or mujoco)' --timeout=120 dimos/

- name: Check disk usage (post-test)
if: always()
run: df -h .

macos-mypy:
needs: [check-changes]
if: needs.check-changes.outputs.should-run == 'true'
runs-on: [self-hosted, macos, arm64]
steps:
- uses: actions/checkout@v4
with:
lfs: false

- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true

- name: Set up Python
run: uv python install 3.12

- name: Install system dependencies
run: brew install gnu-sed gcc portaudio git-lfs libjpeg-turbo

- name: Install dependencies
run: |
uv sync --all-extras --no-extra dds --no-extra cuda --frozen

- name: Run mypy
run: |
source .venv/bin/activate
mypy dimos
# macOS CI retrigger
30 changes: 30 additions & 0 deletions .github/workflows/stale.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Close stale PRs

on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:

permissions:
pull-requests: write

jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
days-before-stale: 23
days-before-close: 7
stale-pr-message: >
This pull request has been automatically marked as stale because it
has not had recent activity. It will be closed in 7 days if no
further activity occurs.
close-pr-message: >
This pull request has been automatically closed because it has been
stale for 30 days with no activity. Feel free to reopen it if you
plan to continue working on it.
stale-pr-label: stale
exempt-pr-labels: pinned,do-not-close
days-before-issue-stale: -1
days-before-issue-close: -1
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ permissions:

jobs:
run-tests:
timeout-minutes: 60
runs-on: [self-hosted, Linux]
container:
image: ghcr.io/dimensionalos/${{ inputs.dev-image }}
Expand Down
25 changes: 11 additions & 14 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ dimos list
# --- Go2 quadruped ---
dimos --replay run unitree-go2 # perception + mapping, replay data
dimos --replay run unitree-go2 --daemon # same, backgrounded
dimos --replay run unitree-go2-agentic # + LLM agent (GPT-4o) + skills
dimos --replay run unitree-go2-agentic-mcp # + McpServer + McpClient (MCP tools live)
dimos --replay run unitree-go2-agentic # + LLM agent (GPT-4o) + skills + MCP server
dimos run unitree-go2-agentic --robot-ip 192.168.123.161 # real Go2 hardware

# --- G1 humanoid ---
Expand All @@ -39,11 +38,11 @@ dimos restart # stop + re-run with same original args

| Blueprint | Robot | Hardware | Agent | MCP server | Notes |
|-----------|-------|----------|-------|------------|-------|
| `unitree-go2-agentic-mcp` | Go2 | real | via McpClient | ✓ | **Only blueprint with McpServer live** |
| `unitree-go2-agentic` | Go2 | real | via McpClient | ✓ | McpServer live |
| `unitree-g1-agentic-sim` | G1 | sim | GPT-4o (G1 prompt) | — | Full agentic sim, no real robot needed |
| `xarm-perception-agent` | xArm | real | GPT-4o | — | Manipulation + perception + agent |
| `xarm7-trajectory-sim` | xArm7 | sim | — | — | Trajectory planning sim |
| `arm-teleop-xarm7` | xArm7 | real | — | — | Quest VR teleop |
| `teleop-quest-xarm7` | xArm7 | real | — | — | Quest VR teleop |
| `dual-xarm6-planner` | xArm6×2 | real | — | — | Dual-arm motion planner |

Run `dimos list` for the full list.
Expand All @@ -52,11 +51,11 @@ Run `dimos list` for the full list.

## Tools available to you (MCP)

**MCP only works if the blueprint includes `McpServer`.** Currently the only shipped blueprint that does is `unitree-go2-agentic-mcp`. All other agentic blueprints use the in-process `Agent` module and do NOT expose an MCP endpoint.
**MCP only works if the blueprint includes `McpServer`.** All shipped agentic blueprints use `McpServer` + `McpClient`. E.g.: `unitree-go2-agentic`.

```bash
# Start the MCP-enabled blueprint first:
dimos --replay run unitree-go2-agentic-mcp --daemon
dimos --replay run unitree-go2-agentic --daemon

# Then use MCP tools:
dimos mcp list-tools # all available skills as JSON
Expand All @@ -73,21 +72,21 @@ The MCP server runs at `http://localhost:9990/mcp` (`GlobalConfig.mcp_port`).

### Adding McpServer to a blueprint

Use **both** `McpServer` and `mcp_client()` — do not mix with `agent()`.
Use **both** `McpServer.blueprint()` and `McpClient.blueprint()`.

```python
from dimos.agents.mcp.mcp_client import mcp_client
from dimos.agents.mcp.mcp_client import McpClient
from dimos.agents.mcp.mcp_server import McpServer

unitree_go2_agentic_mcp = autoconnect(
unitree_go2_agentic = autoconnect(
unitree_go2_spatial, # robot stack
McpServer.blueprint(), # HTTP MCP server — exposes all @skill methods on port 9990
mcp_client(), # LLM agent — fetches tools from McpServer
McpClient.blueprint(), # LLM agent — fetches tools from McpServer
_common_agentic, # skill containers
)
```

Reference: `dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic_mcp.py`
Reference: `dimos/robot/unitree/go2/blueprints/agentic/unitree_go2_agentic.py`

---

Expand Down Expand Up @@ -276,7 +275,7 @@ my_skill_container = MySkillContainer.blueprint
| Go2 (default) | `dimos/agents/system_prompt.py` | `SYSTEM_PROMPT` |
| G1 humanoid | `dimos/robot/unitree/g1/system_prompt.py` | `G1_SYSTEM_PROMPT` |

Pass the robot-specific prompt: `agent(system_prompt=G1_SYSTEM_PROMPT)`. Agent defaults to Go2 — wrong prompt causes hallucinated skills.
Pass the robot-specific prompt: `McpClient.blueprint(system_prompt=G1_SYSTEM_PROMPT)`. The default prompt is Go2-specific; using it on G1 causes hallucinated skills.

### RPC Wiring

Expand Down Expand Up @@ -304,8 +303,6 @@ class MySkillContainer(Module):

If multiple modules match the spec, use `.remappings()` to resolve. Source: `dimos/spec/utils.py`, `dimos/core/blueprints.py`.

**Legacy**: existing skill containers use `rpc_calls: list[str]` + `get_rpc_calls("ClassName.method")`. This still works but wiring failures are silent and only surface at runtime. Don't use it in new code.

### Adding a New Skill

1. Pick the right container (robot-specific or `dimos/agents/skills/`).
Expand Down
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ dimos run unitree-go2
|-------------|-------------|
| `dimos --replay run unitree-go2` | Quadruped navigation replay — SLAM, costmap, A* planning |
| `dimos --replay --replay-dir unitree_go2_office_walk2 run unitree-go2-temporal-memory` | Quadruped temporal memory replay |
| `dimos --simulation run unitree-go2-agentic-mcp` | Quadruped agentic + MCP server in simulation |
| `dimos --simulation run unitree-go2-agentic` | Quadruped agentic + MCP server in simulation |
| `dimos --simulation run unitree-g1` | Humanoid in MuJoCo simulation |
| `dimos --replay run drone-basic` | Drone video + telemetry replay |
| `dimos --replay run drone-agentic` | Drone + LLM agent with flight skills (replay) |
Expand All @@ -204,7 +204,7 @@ dimos run unitree-go2
The `dimos` CLI manages the full lifecycle — run blueprints, inspect state, interact with agents, and call skills via MCP.

```bash
dimos run unitree-go2-agentic-mcp --daemon # Start in background
dimos run unitree-go2-agentic --daemon # Start in background
dimos status # Check what's running
dimos log -f # Follow logs
dimos agent-send "explore the room" # Send agent a command
Expand Down Expand Up @@ -270,17 +270,19 @@ Blueprints are instructions for how to construct and wire modules. We compose th

Blueprints can be composed, remapped, and have transports overridden if `autoconnect()` fails due to conflicting variable names or `In[]` and `Out[]` message types.

A blueprint example that connects the image stream from a robot to an LLM Agent for reasoning and action execution.
A blueprint example that connects the image stream from a robot to an MCP-backed LLM agent for reasoning and action execution.
```py
from dimos.core.blueprints import autoconnect
from dimos.core.transport import LCMTransport
from dimos.msgs.sensor_msgs import Image
from dimos.robot.unitree.go2.connection import go2_connection
from dimos.agents.agent import agent
from dimos.agents.mcp.mcp_client import McpClient
from dimos.agents.mcp.mcp_server import McpServer

blueprint = autoconnect(
go2_connection(),
agent(),
McpServer.blueprint(),
McpClient.blueprint(),
).transports({("color_image", Image): LCMTransport("/color_image", Image)})

# Run the blueprint
Expand Down
77 changes: 0 additions & 77 deletions bin/filter-errors-after-date

This file was deleted.

Loading
Loading