Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion dimos/visualization/rerun/bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@
RerunData: TypeAlias = "Archetype | RerunMulti"


def _dimos_viewer_extra_args(server_uri: str, ws_url: str) -> list[str]:
return ["--connect", server_uri, f"--ws-url={ws_url}"]


def is_rerun_multi(data: Any) -> TypeGuard[RerunMulti]:
"""Check if data is a list of (entity_path, archetype) tuples."""
return (
Expand Down Expand Up @@ -342,12 +346,15 @@ def start(self) -> None:
try:
import rerun_bindings

ws_url = f"ws://{self.host}:{self.config.g.rerun_websocket_server_port}/ws"

# Use --connect so the viewer connects to the bridge's gRPC
# server rather than starting its own (which would conflict).
# Use --ws-url so keyboard teleop events flow back to Dimos.
rerun_bindings.spawn(
executable_name="dimos-viewer",
memory_limit=self.config.memory_limit,
extra_args=["--connect", server_uri],
extra_args=_dimos_viewer_extra_args(server_uri, ws_url),
)
spawned = True
except ImportError:
Expand Down
21 changes: 21 additions & 0 deletions dimos/visualization/rerun/test_viewer_integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,3 +116,24 @@ def test_bridge_has_fallback(self):
"bridge.py start() has no fallback for missing dimos-viewer. "
"Users without dimos-viewer will crash."
)

def test_viewer_extra_args_include_grpc_and_websocket_urls(self):
"""Native dimos-viewer launch must include the teleop WebSocket URL."""
from dimos.visualization.rerun.bridge import _dimos_viewer_extra_args

server_uri = "rerun+http://127.0.0.1:9877/proxy"
ws_url = "ws://127.0.0.1:3030/ws"

assert _dimos_viewer_extra_args(server_uri, ws_url) == [
"--connect",
server_uri,
f"--ws-url={ws_url}",
]

def test_bridge_uses_viewer_extra_args_helper(self):
"""Guard against regressing to gRPC-only native viewer launch."""
from dimos.visualization.rerun.bridge import RerunBridgeModule

src = inspect.getsource(RerunBridgeModule.start)
assert "_dimos_viewer_extra_args" in src
assert "rerun_websocket_server_port" in src