Skip to content

feat(manus): --remote= plugin session and remote tools - #1325

Open
jkim89 wants to merge 5 commits into
jonghyunk/pr05-remote-device-bridgefrom
jonghyunk/pr06-manus-remote-and-tools
Open

jkim89 wants to merge 5 commits into
jonghyunk/pr05-remote-device-bridgefrom
jonghyunk/pr06-manus-remote-and-tools

Conversation

@jkim89

@jkim89 jkim89 commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Summary

Lets manus_hand_plugin run on a host without an OpenXR runtime via --remote=, and adds the remote tools.

What changes

  • --remote=<host:port|ws://…> selects RemotePluginSession in the composition root (main.cpp) only; haptic is unavailable remotely and --remote alone defaults to human,sensors
  • The manus tracker logs glove count and license state every 5 s
  • Tools: remote_hand_sender_synthetic (glove-free sender), latency_probe_xrclient.py / latency_breakdown.py
  • The manus device page documents --remote

What does not change

Default manus behavior without --remote; the plugin class has no transport branches.

Testing

2 pytest suites for the latency tools. Fresh build: ctest 318/318; the tree equals the full integration branch. ASan/UBSan over the 62 remote C++ cases: clean. Real-robot run (laptop gloves → corp network → bridge on the robot machine → real hands): glove-to-bridge age p50 1.3 ms / p99 31 ms at 177 Hz over 2 min.

Depends on

#1324

@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

✅ Preview deployed: https://NVIDIA.github.io/IsaacCapture/preview/pr-1325/

Built from commit f84aeb6. It may take a minute for the updated preview to appear.

@jkim89
jkim89 requested a review from tengw-nv October 23, 2026 21:32
@jkim89
jkim89 marked this pull request as ready for review October 27, 2026 22:49
@jkim89
jkim89 force-pushed the jonghyunk/pr05-remote-device-bridge branch from 7c0c89d to 145356f Compare October 30, 2026 19:12
@jkim89
jkim89 force-pushed the jonghyunk/pr06-manus-remote-and-tools branch from 5888fb9 to b50a5e0 Compare October 30, 2026 19:13
@jkim89
jkim89 force-pushed the jonghyunk/pr06-manus-remote-and-tools branch from b50a5e0 to 34a338c Compare October 30, 2026 21:24
jkim89 and others added 5 commits October 30, 2026 14:35
manus_hand_plugin --remote= builds a RemotePluginSession in the
composition root instead of OpenXRPluginSession, so the glove host needs
no OpenXR runtime; haptic is unavailable remotely and --remote alone
defaults to human,sensors. The manus tracker logs glove count and
license state every 5 s. Tools: remote_hand_sender_synthetic (glove-free
load and loopback sender) and the latency probe/breakdown scripts with
pytest coverage. The manus device page documents --remote.

Signed-off-by: Jonghyun Kim <jonghyunk@nvidia.com>
- remote_hand_sender_synthetic: RemoteAddress::ws_path, parse_remote and
  connect_transport from remote_address.hpp, wrist config in
  PluginSessionRequirements::wrist_tracking_pull, session-owned pull
  channel and wrist source, query(XrHandEXT, t), push channels instead of
  HandTrackingPusher.
- manus: drop the [Manus] prefix from pr06's log lines and point the
  status-line comment at the remote session's "5s:" line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jonghyun Kim <jonghyunk@nvidia.com>
- manus --remote and the synthetic sender dial
  remote_plugin_session::kDefaultBridgePort instead of a 47500 literal
- manus: m_next_status starts one kStatusInterval after construction, so
  log_status() needs no first-call sentinel; comment no longer names
  --remote or RemotePluginSession; drop "P0" from the haptic comment
- synthetic sender: std::numbers::pi, fixed first_joint comment, no
  "warning:" prefix on a warn() line, no explicit channel resets
- latency_breakdown.py: --min-xcorr/--min-edges defaults as module
  constants with %(default)s help; summary prints EDGE_MAD_K and WINDOW_NS
- latency_probe_xrclient.py: drop the undocumented --debug dump
- tests: conftest.py puts tools/ on sys.path for both test files; rename
  the test project to remote-device-bridge-tests
- AGENTS.md: drop the shebang bullet the hook already enforces

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jonghyun Kim <jonghyunk@nvidia.com>
Applied the fact-checked (VERIFIED) findings on code this branch adds:
- ws:// addresses without a port dialed the TCP port: Manus and the
  synthetic sender parse --remote with parse_bridge_remote, which picks the
  scheme's default port.
- Manus parses --remote at startup, rejects it in the same block in builds
  without the remote session, throws if the remote factory is handed
  trackers, and reuses the main logger.
- --datasets is an optional instead of a string plus an explicit flag.
- latency_probe_xrclient.py help text uses %(default)s; the breakdown test
  writes BRIDGE_HEADER instead of retyping it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jonghyun Kim <jonghyunk@nvidia.com>
Applied the fact-checked (VERIFIED) findings on code this branch adds:
- Manus builds its --remote factory with
  remote_plugin_session::make_remote_plugin_session_factory and logs the
  address once at startup.
- The synthetic sender uses std::string::starts_with and checks
  options.hands instead of the left pusher.
- latency_breakdown.breakdown returns a frozen Breakdown dataclass.
- A test comment no longer cites an unexplained case name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Jonghyun Kim <jonghyunk@nvidia.com>
@jkim89
jkim89 force-pushed the jonghyunk/pr05-remote-device-bridge branch from c0d2395 to 69a0f6f Compare October 30, 2026 21:42
@jkim89
jkim89 force-pushed the jonghyunk/pr06-manus-remote-and-tools branch from 34a338c to f84aeb6 Compare October 30, 2026 21:42
@jkim89

jkim89 commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Update (Oct 30): rebased onto #1320–#1324. main.cpp passes the remote factory only for --remote and uses ManusTracker::instance(config) otherwise. Fixed: ws://host with no port connected to the TCP port (present since the first version; now unit-tested). Manus builds against SDK 3.2.1; the local path opens its OpenXR session again (loader fix in #1320). Real-glove run pending before marking ready.

This branch was successfully deployed

1 active (outdated) deployment
dev — b50a5e0b Deployed Oct 30, 2026 by jkim89 via publish-wheel #6337
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants