agenticros 0.0.1 β†’ 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +90 -4
  3. package/dist/commands/config.d.ts +20 -0
  4. package/dist/commands/config.d.ts.map +1 -0
  5. package/dist/commands/config.js +179 -0
  6. package/dist/commands/config.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +33 -0
  8. package/dist/commands/doctor.d.ts.map +1 -0
  9. package/dist/commands/doctor.js +232 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/down.d.ts +15 -0
  12. package/dist/commands/down.d.ts.map +1 -0
  13. package/dist/commands/down.js +91 -0
  14. package/dist/commands/down.js.map +1 -0
  15. package/dist/commands/init.d.ts +21 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +259 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/logs.d.ts +18 -0
  20. package/dist/commands/logs.d.ts.map +1 -0
  21. package/dist/commands/logs.js +67 -0
  22. package/dist/commands/logs.js.map +1 -0
  23. package/dist/commands/status.d.ts +12 -0
  24. package/dist/commands/status.d.ts.map +1 -0
  25. package/dist/commands/status.js +56 -0
  26. package/dist/commands/status.js.map +1 -0
  27. package/dist/commands/up.d.ts +20 -0
  28. package/dist/commands/up.d.ts.map +1 -0
  29. package/dist/commands/up.js +70 -0
  30. package/dist/commands/up.js.map +1 -0
  31. package/dist/index.d.ts +12 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +107 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/menu.d.ts +9 -0
  36. package/dist/menu.d.ts.map +1 -0
  37. package/dist/menu.js +96 -0
  38. package/dist/menu.js.map +1 -0
  39. package/dist/runners/real-robot.d.ts +15 -0
  40. package/dist/runners/real-robot.d.ts.map +1 -0
  41. package/dist/runners/real-robot.js +46 -0
  42. package/dist/runners/real-robot.js.map +1 -0
  43. package/dist/runners/sim.d.ts +19 -0
  44. package/dist/runners/sim.d.ts.map +1 -0
  45. package/dist/runners/sim.js +53 -0
  46. package/dist/runners/sim.js.map +1 -0
  47. package/dist/util/env.d.ts +24 -0
  48. package/dist/util/env.d.ts.map +1 -0
  49. package/dist/util/env.js +53 -0
  50. package/dist/util/env.js.map +1 -0
  51. package/dist/util/logger.d.ts +24 -0
  52. package/dist/util/logger.d.ts.map +1 -0
  53. package/dist/util/logger.js +62 -0
  54. package/dist/util/logger.js.map +1 -0
  55. package/dist/util/paths.d.ts +57 -0
  56. package/dist/util/paths.d.ts.map +1 -0
  57. package/dist/util/paths.js +132 -0
  58. package/dist/util/paths.js.map +1 -0
  59. package/dist/util/pidfile.d.ts +16 -0
  60. package/dist/util/pidfile.d.ts.map +1 -0
  61. package/dist/util/pidfile.js +63 -0
  62. package/dist/util/pidfile.js.map +1 -0
  63. package/dist/util/state.d.ts +26 -0
  64. package/dist/util/state.d.ts.map +1 -0
  65. package/dist/util/state.js +55 -0
  66. package/dist/util/state.js.map +1 -0
  67. package/package.json +60 -1
  68. package/runtime/BUNDLE.json +11 -0
  69. package/runtime/LICENSE +192 -0
  70. package/runtime/README.md +273 -0
  71. package/runtime/docs/architecture.md +366 -0
  72. package/runtime/docs/cli.md +140 -0
  73. package/runtime/docs/memory.md +292 -0
  74. package/runtime/docs/robot-setup.md +347 -0
  75. package/runtime/package.json +28 -0
  76. package/runtime/packages/agenticros/agenticros-agenticros-0.0.1.tgz +0 -0
  77. package/runtime/packages/agenticros/openclaw.plugin.json +451 -0
  78. package/runtime/packages/agenticros/package.json +41 -0
  79. package/runtime/packages/agenticros/src/camera-snapshot-cache.ts +59 -0
  80. package/runtime/packages/agenticros/src/camera-snapshot-routes.ts +44 -0
  81. package/runtime/packages/agenticros/src/commands/estop.ts +41 -0
  82. package/runtime/packages/agenticros/src/commands/transport.ts +195 -0
  83. package/runtime/packages/agenticros/src/config-file.ts +136 -0
  84. package/runtime/packages/agenticros/src/config-page.ts +498 -0
  85. package/runtime/packages/agenticros/src/context/robot-context.ts +373 -0
  86. package/runtime/packages/agenticros/src/depth.ts +313 -0
  87. package/runtime/packages/agenticros/src/describer.ts +157 -0
  88. package/runtime/packages/agenticros/src/image-binary-trim.ts +16 -0
  89. package/runtime/packages/agenticros/src/index.ts +85 -0
  90. package/runtime/packages/agenticros/src/landing-page.ts +38 -0
  91. package/runtime/packages/agenticros/src/memory.ts +44 -0
  92. package/runtime/packages/agenticros/src/plugin-api.ts +173 -0
  93. package/runtime/packages/agenticros/src/plugin-image-base64.ts +69 -0
  94. package/runtime/packages/agenticros/src/preflight.ts +110 -0
  95. package/runtime/packages/agenticros/src/routes.ts +328 -0
  96. package/runtime/packages/agenticros/src/safety/validator.ts +43 -0
  97. package/runtime/packages/agenticros/src/service.ts +359 -0
  98. package/runtime/packages/agenticros/src/skill-api.ts +65 -0
  99. package/runtime/packages/agenticros/src/skill-loader.ts +146 -0
  100. package/runtime/packages/agenticros/src/teleop/page.ts +498 -0
  101. package/runtime/packages/agenticros/src/teleop/routes.ts +650 -0
  102. package/runtime/packages/agenticros/src/tools/index.ts +26 -0
  103. package/runtime/packages/agenticros/src/tools/ros2-action.ts +50 -0
  104. package/runtime/packages/agenticros/src/tools/ros2-camera.ts +221 -0
  105. package/runtime/packages/agenticros/src/tools/ros2-depth-distance.ts +58 -0
  106. package/runtime/packages/agenticros/src/tools/ros2-introspect.ts +62 -0
  107. package/runtime/packages/agenticros/src/tools/ros2-memory.ts +158 -0
  108. package/runtime/packages/agenticros/src/tools/ros2-param.ts +87 -0
  109. package/runtime/packages/agenticros/src/tools/ros2-publish.ts +52 -0
  110. package/runtime/packages/agenticros/src/tools/ros2-service.ts +46 -0
  111. package/runtime/packages/agenticros/src/tools/ros2-subscribe.ts +71 -0
  112. package/runtime/packages/agenticros/tsconfig.json +9 -0
  113. package/runtime/packages/agenticros-claude-code/README.md +260 -0
  114. package/runtime/packages/agenticros-claude-code/config.example.json +9 -0
  115. package/runtime/packages/agenticros-claude-code/dist/config.d.ts +8 -0
  116. package/runtime/packages/agenticros-claude-code/dist/config.d.ts.map +1 -0
  117. package/runtime/packages/agenticros-claude-code/dist/config.js +93 -0
  118. package/runtime/packages/agenticros-claude-code/dist/config.js.map +1 -0
  119. package/runtime/packages/agenticros-claude-code/dist/depth.d.ts +20 -0
  120. package/runtime/packages/agenticros-claude-code/dist/depth.d.ts.map +1 -0
  121. package/runtime/packages/agenticros-claude-code/dist/depth.js +126 -0
  122. package/runtime/packages/agenticros-claude-code/dist/depth.js.map +1 -0
  123. package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.d.ts +6 -0
  124. package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.d.ts.map +1 -0
  125. package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.js +36 -0
  126. package/runtime/packages/agenticros-claude-code/dist/find-object/coco-classes.js.map +1 -0
  127. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts +33 -0
  128. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.d.ts.map +1 -0
  129. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js +134 -0
  130. package/runtime/packages/agenticros-claude-code/dist/find-object/find-object.js.map +1 -0
  131. package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.d.ts +43 -0
  132. package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.d.ts.map +1 -0
  133. package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.js +73 -0
  134. package/runtime/packages/agenticros-claude-code/dist/follow-me/controller.js.map +1 -0
  135. package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.d.ts +58 -0
  136. package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.d.ts.map +1 -0
  137. package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.js +251 -0
  138. package/runtime/packages/agenticros-claude-code/dist/follow-me/detector.js.map +1 -0
  139. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts +61 -0
  140. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.d.ts.map +1 -0
  141. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js +268 -0
  142. package/runtime/packages/agenticros-claude-code/dist/follow-me/loop.js.map +1 -0
  143. package/runtime/packages/agenticros-claude-code/dist/index.d.ts +3 -0
  144. package/runtime/packages/agenticros-claude-code/dist/index.d.ts.map +1 -0
  145. package/runtime/packages/agenticros-claude-code/dist/index.js +111 -0
  146. package/runtime/packages/agenticros-claude-code/dist/index.js.map +1 -0
  147. package/runtime/packages/agenticros-claude-code/dist/memory.d.ts +17 -0
  148. package/runtime/packages/agenticros-claude-code/dist/memory.d.ts.map +1 -0
  149. package/runtime/packages/agenticros-claude-code/dist/memory.js +44 -0
  150. package/runtime/packages/agenticros-claude-code/dist/memory.js.map +1 -0
  151. package/runtime/packages/agenticros-claude-code/dist/safety.d.ts +10 -0
  152. package/runtime/packages/agenticros-claude-code/dist/safety.d.ts.map +1 -0
  153. package/runtime/packages/agenticros-claude-code/dist/safety.js +34 -0
  154. package/runtime/packages/agenticros-claude-code/dist/safety.js.map +1 -0
  155. package/runtime/packages/agenticros-claude-code/dist/tools.d.ts +36 -0
  156. package/runtime/packages/agenticros-claude-code/dist/tools.d.ts.map +1 -0
  157. package/runtime/packages/agenticros-claude-code/dist/tools.js +777 -0
  158. package/runtime/packages/agenticros-claude-code/dist/tools.js.map +1 -0
  159. package/runtime/packages/agenticros-claude-code/dist/transport.d.ts +17 -0
  160. package/runtime/packages/agenticros-claude-code/dist/transport.d.ts.map +1 -0
  161. package/runtime/packages/agenticros-claude-code/dist/transport.js +46 -0
  162. package/runtime/packages/agenticros-claude-code/dist/transport.js.map +1 -0
  163. package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.d.ts +42 -0
  164. package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.d.ts.map +1 -0
  165. package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.js +114 -0
  166. package/runtime/packages/agenticros-claude-code/dist/zero-shot/detector.js.map +1 -0
  167. package/runtime/packages/agenticros-claude-code/package.json +29 -0
  168. package/runtime/packages/agenticros-claude-code/src/config.ts +96 -0
  169. package/runtime/packages/agenticros-claude-code/src/depth.ts +173 -0
  170. package/runtime/packages/agenticros-claude-code/src/find-object/coco-classes.ts +38 -0
  171. package/runtime/packages/agenticros-claude-code/src/find-object/find-object.ts +190 -0
  172. package/runtime/packages/agenticros-claude-code/src/follow-me/controller.ts +109 -0
  173. package/runtime/packages/agenticros-claude-code/src/follow-me/depth-loop.ts +420 -0
  174. package/runtime/packages/agenticros-claude-code/src/follow-me/detector.ts +303 -0
  175. package/runtime/packages/agenticros-claude-code/src/follow-me/loop.ts +330 -0
  176. package/runtime/packages/agenticros-claude-code/src/index.ts +125 -0
  177. package/runtime/packages/agenticros-claude-code/src/memory.ts +51 -0
  178. package/runtime/packages/agenticros-claude-code/src/safety.ts +44 -0
  179. package/runtime/packages/agenticros-claude-code/src/tools.ts +891 -0
  180. package/runtime/packages/agenticros-claude-code/src/transport.ts +58 -0
  181. package/runtime/packages/agenticros-claude-code/src/zero-shot/detector.ts +169 -0
  182. package/runtime/packages/agenticros-claude-code/tsconfig.json +9 -0
  183. package/runtime/packages/agenticros-claude-code/yolo-debug.mjs +106 -0
  184. package/runtime/packages/agenticros-gemini/README.md +139 -0
  185. package/runtime/packages/agenticros-gemini/package.json +28 -0
  186. package/runtime/packages/agenticros-gemini/scripts/smoke-api.mjs +42 -0
  187. package/runtime/packages/agenticros-gemini/src/chat.ts +139 -0
  188. package/runtime/packages/agenticros-gemini/src/config.ts +92 -0
  189. package/runtime/packages/agenticros-gemini/src/depth.ts +173 -0
  190. package/runtime/packages/agenticros-gemini/src/index.ts +58 -0
  191. package/runtime/packages/agenticros-gemini/src/memory.ts +32 -0
  192. package/runtime/packages/agenticros-gemini/src/safety.ts +44 -0
  193. package/runtime/packages/agenticros-gemini/src/tools.ts +516 -0
  194. package/runtime/packages/agenticros-gemini/src/transport.ts +58 -0
  195. package/runtime/packages/agenticros-gemini/tsconfig.json +8 -0
  196. package/runtime/packages/core/package.json +47 -0
  197. package/runtime/packages/core/src/banner.ts +32 -0
  198. package/runtime/packages/core/src/cmd-vel-twist.ts +31 -0
  199. package/runtime/packages/core/src/config.ts +279 -0
  200. package/runtime/packages/core/src/index.ts +54 -0
  201. package/runtime/packages/core/src/memory/__tests__/factory.test.ts +70 -0
  202. package/runtime/packages/core/src/memory/__tests__/local-provider.test.ts +195 -0
  203. package/runtime/packages/core/src/memory/__tests__/mem0-provider.test.ts +192 -0
  204. package/runtime/packages/core/src/memory/__tests__/smart-defaults.test.ts +46 -0
  205. package/runtime/packages/core/src/memory/factory.ts +63 -0
  206. package/runtime/packages/core/src/memory/index.ts +10 -0
  207. package/runtime/packages/core/src/memory/local/provider.ts +229 -0
  208. package/runtime/packages/core/src/memory/mem0/provider.ts +379 -0
  209. package/runtime/packages/core/src/memory/types.ts +96 -0
  210. package/runtime/packages/core/src/topic-utils.ts +95 -0
  211. package/runtime/packages/core/src/transport/factory.ts +47 -0
  212. package/runtime/packages/core/src/transport/local/conversion.ts +333 -0
  213. package/runtime/packages/core/src/transport/local/entities.ts +129 -0
  214. package/runtime/packages/core/src/transport/local/transport.ts +406 -0
  215. package/runtime/packages/core/src/transport/rosbridge/actions.ts +81 -0
  216. package/runtime/packages/core/src/transport/rosbridge/adapter.ts +157 -0
  217. package/runtime/packages/core/src/transport/rosbridge/client.ts +438 -0
  218. package/runtime/packages/core/src/transport/rosbridge/services.ts +41 -0
  219. package/runtime/packages/core/src/transport/rosbridge/topics.ts +60 -0
  220. package/runtime/packages/core/src/transport/rosbridge/types.ts +118 -0
  221. package/runtime/packages/core/src/transport/transport.ts +77 -0
  222. package/runtime/packages/core/src/transport/types.ts +137 -0
  223. package/runtime/packages/core/src/transport/webrtc/signaling-client.ts +196 -0
  224. package/runtime/packages/core/src/transport/webrtc/signaling-types.ts +130 -0
  225. package/runtime/packages/core/src/transport/webrtc/transport.ts +516 -0
  226. package/runtime/packages/core/src/transport/zenoh/adapter.ts +357 -0
  227. package/runtime/packages/core/src/transport/zenoh/cdr.ts +183 -0
  228. package/runtime/packages/core/src/transport/zenoh/keys.ts +51 -0
  229. package/runtime/packages/core/tsconfig.json +9 -0
  230. package/runtime/packages/ros-camera/package.json +30 -0
  231. package/runtime/packages/ros-camera/src/index.ts +13 -0
  232. package/runtime/packages/ros-camera/src/snapshot.ts +372 -0
  233. package/runtime/packages/ros-camera/tsconfig.json +9 -0
  234. package/runtime/pnpm-lock.yaml +5260 -0
  235. package/runtime/pnpm-workspace.yaml +2 -0
  236. package/runtime/ros2_ws/src/agenticros_agent/agenticros_agent/__init__.py +0 -0
  237. package/runtime/ros2_ws/src/agenticros_agent/agenticros_agent/agent_node.py +561 -0
  238. package/runtime/ros2_ws/src/agenticros_agent/package.xml +25 -0
  239. package/runtime/ros2_ws/src/agenticros_agent/resource/agenticros_agent +0 -0
  240. package/runtime/ros2_ws/src/agenticros_agent/setup.cfg +4 -0
  241. package/runtime/ros2_ws/src/agenticros_agent/setup.py +25 -0
  242. package/runtime/ros2_ws/src/agenticros_bringup/README.md +128 -0
  243. package/runtime/ros2_ws/src/agenticros_bringup/agenticros_bringup/__init__.py +1 -0
  244. package/runtime/ros2_ws/src/agenticros_bringup/agenticros_bringup/cmd_vel_relay.py +33 -0
  245. package/runtime/ros2_ws/src/agenticros_bringup/launch/cmd_vel_bridge.launch.py +58 -0
  246. package/runtime/ros2_ws/src/agenticros_bringup/launch/gazebo_turtlebot3.launch.py +69 -0
  247. package/runtime/ros2_ws/src/agenticros_bringup/launch/mode_a_gazebo.launch.py +55 -0
  248. package/runtime/ros2_ws/src/agenticros_bringup/launch/mode_a_gazebo_rviz.launch.py +48 -0
  249. package/runtime/ros2_ws/src/agenticros_bringup/launch/realsense_rosbridge.launch.py +154 -0
  250. package/runtime/ros2_ws/src/agenticros_bringup/launch/rosbridge_gazebo.launch.py +54 -0
  251. package/runtime/ros2_ws/src/agenticros_bringup/launch/rviz.launch.py +38 -0
  252. package/runtime/ros2_ws/src/agenticros_bringup/launch/turtlebot3_gazebo_rviz.launch.py +42 -0
  253. package/runtime/ros2_ws/src/agenticros_bringup/package.xml +24 -0
  254. package/runtime/ros2_ws/src/agenticros_bringup/resource/agenticros_bringup +0 -0
  255. package/runtime/ros2_ws/src/agenticros_bringup/rviz/turtlebot3_agenticros.rviz +174 -0
  256. package/runtime/ros2_ws/src/agenticros_bringup/setup.cfg +4 -0
  257. package/runtime/ros2_ws/src/agenticros_bringup/setup.py +28 -0
  258. package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/__init__.py +0 -0
  259. package/runtime/ros2_ws/src/agenticros_discovery/agenticros_discovery/discovery_node.py +172 -0
  260. package/runtime/ros2_ws/src/agenticros_discovery/package.xml +22 -0
  261. package/runtime/ros2_ws/src/agenticros_discovery/resource/agenticros_discovery +0 -0
  262. package/runtime/ros2_ws/src/agenticros_discovery/setup.cfg +5 -0
  263. package/runtime/ros2_ws/src/agenticros_discovery/setup.py +25 -0
  264. package/runtime/ros2_ws/src/agenticros_follow_me/README.md +66 -0
  265. package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/__init__.py +1 -0
  266. package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/__main__.py +5 -0
  267. package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/follow_me_node.py +278 -0
  268. package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/follower_controller.py +631 -0
  269. package/runtime/ros2_ws/src/agenticros_follow_me/agenticros_follow_me/person_tracker.py +635 -0
  270. package/runtime/ros2_ws/src/agenticros_follow_me/package.xml +22 -0
  271. package/runtime/ros2_ws/src/agenticros_follow_me/resource/agenticros_follow_me +0 -0
  272. package/runtime/ros2_ws/src/agenticros_follow_me/setup.py +25 -0
  273. package/runtime/ros2_ws/src/agenticros_msgs/CMakeLists.txt +26 -0
  274. package/runtime/ros2_ws/src/agenticros_msgs/msg/CapabilityManifest.msg +9 -0
  275. package/runtime/ros2_ws/src/agenticros_msgs/package.xml +22 -0
  276. package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeGetStatus.srv +11 -0
  277. package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeSetDistance.srv +4 -0
  278. package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeSetTarget.srv +6 -0
  279. package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeStart.srv +5 -0
  280. package/runtime/ros2_ws/src/agenticros_msgs/srv/FollowMeStop.srv +3 -0
  281. package/runtime/ros2_ws/src/agenticros_msgs/srv/GetCapabilities.srv +5 -0
  282. package/runtime/ros2_ws/src/agenticros_sim/CMakeLists.txt +24 -0
  283. package/runtime/ros2_ws/src/agenticros_sim/README.md +120 -0
  284. package/runtime/ros2_ws/src/agenticros_sim/config/agenticros-sim.config.json +28 -0
  285. package/runtime/ros2_ws/src/agenticros_sim/config/amr_bridge.yaml +111 -0
  286. package/runtime/ros2_ws/src/agenticros_sim/config/amr_view.rviz +172 -0
  287. package/runtime/ros2_ws/src/agenticros_sim/env-hooks/gz_resource_path.dsv.in +3 -0
  288. package/runtime/ros2_ws/src/agenticros_sim/env-hooks/gz_resource_path.sh.in +7 -0
  289. package/runtime/ros2_ws/src/agenticros_sim/launch/sim_amr.launch.py +159 -0
  290. package/runtime/ros2_ws/src/agenticros_sim/models/agenticros_amr/model.config +17 -0
  291. package/runtime/ros2_ws/src/agenticros_sim/models/agenticros_amr/model.sdf +244 -0
  292. package/runtime/ros2_ws/src/agenticros_sim/package.xml +27 -0
  293. package/runtime/ros2_ws/src/agenticros_sim/worlds/agenticros_indoor.sdf +183 -0
  294. package/runtime/scripts/activate_workspace.sh +285 -0
  295. package/runtime/scripts/agenticros-describer.policy.yaml +96 -0
  296. package/runtime/scripts/agenticros-proxy.cjs +99 -0
  297. package/runtime/scripts/agenticros-rosbridge.policy.yaml +62 -0
  298. package/runtime/scripts/check-cli-tarball-size.mjs +42 -0
  299. package/runtime/scripts/configure_agenticros.sh +200 -0
  300. package/runtime/scripts/configure_for_sim.sh +64 -0
  301. package/runtime/scripts/fix-openclaw-control-ui-path.sh +20 -0
  302. package/runtime/scripts/install_cli.sh +94 -0
  303. package/runtime/scripts/install_rosbridge_from_source.sh +67 -0
  304. package/runtime/scripts/lib/agenticros-banner.sh +28 -0
  305. package/runtime/scripts/onboard_robot.sh +75 -0
  306. package/runtime/scripts/openai.policy.yaml +77 -0
  307. package/runtime/scripts/openclaw-dashboard-url.cjs +49 -0
  308. package/runtime/scripts/pack-runtime.mjs +245 -0
  309. package/runtime/scripts/run_demo_native.sh +43 -0
  310. package/runtime/scripts/run_nemoclaw_host_stack.sh +91 -0
  311. package/runtime/scripts/run_robot_rosbridge.sh +36 -0
  312. package/runtime/scripts/sandbox_rosbridge_relay.py +137 -0
  313. package/runtime/scripts/setup-openclaw-local.cjs +75 -0
  314. package/runtime/scripts/setup_gateway_plugin.sh +329 -0
  315. package/runtime/scripts/setup_robot.sh +113 -0
  316. package/runtime/scripts/setup_workspace.sh +484 -0
  317. package/runtime/scripts/sim/run_sim.sh +146 -0
  318. package/runtime/scripts/smoke_test_nemoclaw.sh +123 -0
  319. package/runtime/scripts/start_demo.sh +55 -0
  320. package/runtime/scripts/sync-skill-tools.mjs +335 -0
  321. package/runtime/scripts/test-follow-me-sim.mjs +135 -0
  322. package/runtime/scripts/test-mcp-e2e.mjs +184 -0
  323. package/runtime/scripts/test-rclnodejs.mts +129 -0
  324. package/runtime/scripts/use-openclaw-2026.2.26.sh +19 -0
  325. package/runtime/scripts/use-openclaw-2026.3.11.sh +19 -0
  326. package/runtime/scripts/zenoh-bridge-ros2dds-robot.json5 +30 -0
  327. package/runtime/scripts/zenohd-agenticros.json5 +11 -0
  328. package/runtime/scripts/zenohd-rosclaw.json5 +11 -0
  329. package/runtime/tsconfig.base.json +19 -0
  330. package/index.js +0 -6
@@ -0,0 +1,366 @@
1
+ # AgenticROS System Architecture
2
+
3
+ ![AgenticROS architecture: agent platforms β†’ adapter packages β†’ shared TypeScript runtime β†’ transports β†’ ROS 2 workspace and robot](images/agenticros-architecture.png)
4
+
5
+ AgenticROS supports four deployment modes depending on where OpenClaw runs
6
+ relative to the robot. The AI Gateway layer and ROS2 layer remain the same
7
+ across all modes β€” only the transport between them changes.
8
+
9
+ The diagram above shows how every agent platform (OpenClaw Gateway, Codex /
10
+ Claude Code, Gemini CLI, and direct users/operators) funnels through adapter
11
+ packages into the shared `@agenticros/core` runtime, then out across the
12
+ configured transport (Zenoh, rosbridge, local DDS, or WebRTC) to the ROS 2
13
+ workspace and robot hardware. The text diagrams below break out each
14
+ deployment mode in more detail.
15
+
16
+ ---
17
+
18
+ ## AI Gateway Layer (common to all modes)
19
+
20
+ ```
21
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
22
+ β”‚ MESSAGING LAYER β”‚
23
+ β”‚ β”‚
24
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
25
+ β”‚ β”‚ WhatsApp β”‚ β”‚ Telegram β”‚ β”‚ Discord β”‚ β”‚ Slack β”‚ β”‚ Web Chat β”‚ β”‚
26
+ β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚
27
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
28
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
29
+ β–Ό
30
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
31
+ β”‚ AI GATEWAY LAYER β”‚
32
+ β”‚ β”‚
33
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
34
+ β”‚ β”‚ OPENCLAW GATEWAY β”‚ β”‚
35
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
36
+ β”‚ β”‚ β”‚ Sessions β”‚ β”‚ AI Agent β”‚ β”‚ Memory / State β”‚ β”‚ β”‚
37
+ β”‚ β”‚ β”‚ (per-user) β”‚ β”‚ (intent β†’ β”‚ β”‚ (cross-conversation) β”‚ β”‚ β”‚
38
+ β”‚ β”‚ β”‚ β”‚ β”‚ tool calls) β”‚ β”‚ β”‚ β”‚ β”‚
39
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
40
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
41
+ β”‚ β–Ό β”‚
42
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
43
+ β”‚ β”‚ AGENTICROS PLUGIN β”‚ β”‚
44
+ β”‚ β”‚ β”‚ β”‚
45
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
46
+ β”‚ β”‚ β”‚ TOOL REGISTRY β”‚ β”‚ β”‚
47
+ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
48
+ β”‚ β”‚ β”‚ ros2_publish ros2_subscribe_once ros2_service_call β”‚ β”‚ β”‚
49
+ β”‚ β”‚ β”‚ ros2_action_goal ros2_param_get/set ros2_list_topics β”‚ β”‚ β”‚
50
+ β”‚ β”‚ β”‚ ros2_camera_snapshot follow_robot (Follow Me mission) β”‚ β”‚ β”‚
51
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
52
+ β”‚ β”‚ β”‚ β”‚ β”‚
53
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
54
+ β”‚ β”‚ β”‚ SKILLS β”‚ β”‚ SAFETY VALIDATOR β”‚ β”‚ ROBOT CONTEXT β”‚ β”‚ β”‚
55
+ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
56
+ β”‚ β”‚ β”‚ navigate-to β”‚ β”‚ before_tool_call β”‚ β”‚ before_agent_start β”‚ β”‚ β”‚
57
+ β”‚ β”‚ β”‚ take-photo β”‚ β”‚ Β· velocity limits β”‚ β”‚ Β· capabilities β”‚ β”‚ β”‚
58
+ β”‚ β”‚ β”‚ check-status β”‚ β”‚ Β· workspace bounds β”‚ β”‚ Β· topics/services β”‚ β”‚ β”‚
59
+ β”‚ β”‚ β”‚ pick-object β”‚ β”‚ Β· blocked ops β”‚ β”‚ Β· safety config β”‚ β”‚ β”‚
60
+ β”‚ β”‚ β”‚ follow-me β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
61
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
62
+ β”‚ β”‚ β”‚ β”‚ β”‚
63
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
64
+ β”‚ β”‚ β”‚ /estop COMMAND β”‚ β”‚ TRANSPORT ADAPTER β”‚ β”‚ β”‚
65
+ β”‚ β”‚ β”‚ (bypasses AI entirely) β”‚ β”‚ (mode-dependent, see below) β”‚ β”‚ β”‚
66
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
67
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
68
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
69
+ β”‚
70
+ β–Ό
71
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
72
+ β”‚ Mode A, B, C, or D β”‚
73
+ β”‚ (see below) β”‚
74
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
75
+ ```
76
+
77
+ ## ROS2 Layer (common to all modes)
78
+
79
+ ```
80
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
81
+ β”‚ ROS2 LAYER β”‚
82
+ β”‚ β”‚
83
+ β”‚ ROS2 DDS Bus β”‚
84
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
85
+ β”‚ β–Ό β–Ό β–Ό β–Ό β–Ό β”‚
86
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
87
+ β”‚ β”‚ /cmd_vel β”‚β”‚ /odom β”‚β”‚/camera β”‚β”‚/battery β”‚β”‚/diagnostics β”‚ ... β”‚
88
+ β”‚ β”‚ (Twist) β”‚β”‚(Odom) β”‚β”‚(Image) β”‚β”‚(State) β”‚β”‚(DiagArray) β”‚ β”‚
89
+ β”‚ β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
90
+ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
91
+ β”‚ β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
92
+ β”‚ β”‚ ROBOT HARDWARE β”‚ β”‚
93
+ β”‚ β”‚ β”‚ β”‚
94
+ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚
95
+ β”‚ β”‚ β”‚ Motors β”‚ β”‚ Camera β”‚ β”‚ LIDAR β”‚ β”‚ IMU β”‚ ... β”‚ β”‚
96
+ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚
97
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
98
+ β”‚ β”‚
99
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
100
+ β”‚ β”‚ agenticros_discovery β”‚ β”‚ Nav2 / MoveIt2 / Other Stacks β”‚ β”‚
101
+ β”‚ β”‚ (capability introspection) β”‚ β”‚ (navigation, manipulation) β”‚ β”‚
102
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
103
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
104
+ ```
105
+
106
+ ---
107
+
108
+ ## Deployment Mode A: Same Machine
109
+
110
+ OpenClaw runs directly on the robot's computer. The plugin talks to ROS2
111
+ natively through the local DDS bus β€” no network transport needed. The user
112
+ only interacts through messaging apps over the internet.
113
+
114
+ Best for: single-robot setups, embedded deployments, edge devices with
115
+ internet access.
116
+
117
+ ```
118
+ User (Telegram, WhatsApp, etc.)
119
+ β”‚
120
+ β”‚ internet
121
+ β–Ό
122
+ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
123
+ β”‚ ROBOT MACHINE β”‚
124
+ β”‚ β”‚
125
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
126
+ β”‚ β”‚ OPENCLAW + AGENTICROS PLUGIN β”‚ β”‚
127
+ β”‚ β”‚ β”‚ β”‚
128
+ β”‚ β”‚ AI Agent β†’ Safety Validator β†’ Tool Execution β”‚ β”‚
129
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
130
+ β”‚ β”‚ β”‚
131
+ β”‚ β”‚ direct (local DDS / rclnodejs) β”‚
132
+ β”‚ β–Ό β”‚
133
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
134
+ β”‚ β”‚ ROS2 DDS Bus β”‚ β”‚
135
+ β”‚ β”‚ /cmd_vel /odom /camera /battery /diagnostics ... β”‚ β”‚
136
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
137
+ β”‚ β–Ό β”‚
138
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
139
+ β”‚ β”‚ ROBOT HARDWARE (motors, camera, LIDAR, IMU) β”‚ β”‚
140
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
141
+ β”‚ β”‚
142
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜
143
+
144
+ Transport: none (same process / local IPC)
145
+ Latency: ~ms
146
+ NAT issue: none β€” only outbound internet needed for messaging APIs
147
+ ```
148
+
149
+ ---
150
+
151
+ ## Deployment Mode B: Local Network
152
+
153
+ OpenClaw runs on a separate machine on the same network as the robot
154
+ (e.g. a laptop, local server, or dev workstation). The plugin connects to
155
+ rosbridge_server on the robot via WebSocket over LAN.
156
+
157
+ Best for: development, testing, multi-robot labs, on-premises deployments
158
+ where everything is on the same network.
159
+
160
+ ```
161
+ User (Telegram, WhatsApp, etc.)
162
+ β”‚
163
+ β”‚ internet
164
+ β–Ό
165
+ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
166
+ β”‚ LOCAL SERVER / DEV MACHINE β”‚ β”‚ ROBOT β”‚
167
+ β”‚ β”‚ β”‚ β”‚
168
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
169
+ β”‚ β”‚ OPENCLAW + AGENTICROS β”‚ β”‚ β”‚ β”‚ rosbridge_server β”‚ β”‚
170
+ β”‚ β”‚ PLUGIN │──┼─────┼─►│ (WebSocket β†’ ROS2 DDS) β”‚ β”‚
171
+ β”‚ β”‚ β”‚ β”‚ LAN β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
172
+ β”‚ β”‚ rosbridge-client lib β”‚ β”‚ WS β”‚ β”‚ β”‚
173
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β–Ό β”‚
174
+ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
175
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜ β”‚ β”‚ ROS2 DDS Bus β”‚ β”‚
176
+ β”‚ β”‚ /cmd_vel /odom ... β”‚ β”‚
177
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
178
+ β”‚ β–Ό β”‚
179
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
180
+ β”‚ β”‚ ROBOT HARDWARE β”‚ β”‚
181
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
182
+ β”‚ β”‚
183
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜
184
+
185
+ Transport: WebSocket (ws://robot-ip:9090) via rosbridge protocol
186
+ Latency: ~ms (LAN)
187
+ NAT issue: none β€” both machines are on the same network
188
+ ```
189
+
190
+ ---
191
+
192
+ ## Deployment Mode C: Cloud / Remote
193
+
194
+ OpenClaw runs on a cloud server or VPS. The robot is on a remote network
195
+ (factory, warehouse, field) behind NAT/firewall. Neither side can directly
196
+ reach the other. A WebRTC connection with STUN/TURN handles NAT traversal
197
+ so both sides can establish peer-to-peer communication.
198
+
199
+ Best for: production deployments, remote operations, fleet management,
200
+ when operators and robots are in different locations.
201
+
202
+ ```
203
+ User (Telegram, WhatsApp, etc.)
204
+ β”‚
205
+ β”‚ internet
206
+ β–Ό
207
+ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
208
+ β”‚ CLOUD / VPS β”‚ β”‚ ROBOT (behind NAT/firewall) β”‚
209
+ β”‚ β”‚ β”‚ β”‚
210
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
211
+ β”‚ β”‚ OPENCLAW + AGENTICROS β”‚ β”‚ β”‚ β”‚ AgenticROS Agent Node β”‚ β”‚
212
+ β”‚ β”‚ PLUGIN β”‚ β”‚ β”‚ β”‚ (ROS2 node) β”‚ β”‚
213
+ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚
214
+ β”‚ β”‚ WebRTC data channel │◄─┼── P2P or TURN ──┼─►│ WebRTC data channel β”‚ β”‚
215
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ (encrypted) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
216
+ β”‚ β”‚ β”‚ β”‚ β”‚
217
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜ β”‚ β”‚ local DDS β”‚
218
+ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β–Ό β”‚
219
+ β”‚ STUN / β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
220
+ β”‚ TURN β”‚ β”‚ β”‚ ROS2 DDS Bus β”‚ β”‚
221
+ β”‚ Server β”‚ β”‚ β”‚ /cmd_vel /odom ... β”‚ β”‚
222
+ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
223
+ β”‚ β–Ό β”‚
224
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
225
+ β”‚ β”‚ ROBOT HARDWARE β”‚ β”‚
226
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
227
+ β”‚ β”‚
228
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜
229
+
230
+ Transport: WebRTC data channel (STUN for NAT traversal, TURN as relay fallback)
231
+ Latency: ~10-100ms (internet, varies)
232
+ NAT issue: solved β€” both sides connect outbound to STUN/TURN, then P2P
233
+ ```
234
+
235
+ In Mode C, the robot runs a **AgenticROS Agent Node** (`agenticros_agent`) β€” a
236
+ lightweight ROS2 node that connects outbound to the signaling/TURN server
237
+ and establishes a WebRTC data channel with the cloud-side plugin. Commands
238
+ and feedback flow over this encrypted peer-to-peer channel. Neither side
239
+ needs a public IP or open inbound ports.
240
+
241
+ ---
242
+
243
+ ## Deployment Mode D: Zenoh
244
+
245
+ When the robot uses **ROS 2 with Zenoh RMW** (`RMW_IMPLEMENTATION=rmw_zenoh_cpp`),
246
+ the plugin can connect directly to a Zenoh router via **zenoh-ts** (WebSocket to
247
+ `zenoh-plugin-remote-api`). No rosbridge or WebRTC bridge is required.
248
+
249
+ Best for: robots already on Zenoh, low-latency pub/sub, or deployments that
250
+ prefer the Zenoh stack over DDS.
251
+
252
+ ```
253
+ User (Telegram, WhatsApp, etc.)
254
+ β”‚
255
+ β”‚ internet
256
+ β–Ό
257
+ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ β”Œ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
258
+ β”‚ OPENCLAW MACHINE β”‚ β”‚ ROBOT (Zenoh RMW) β”‚
259
+ β”‚ β”‚ β”‚ β”‚
260
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
261
+ β”‚ β”‚ OPENCLAW + AGENTICROS β”‚ β”‚ β”‚ β”‚ Zenoh router β”‚ β”‚
262
+ β”‚ β”‚ PLUGIN β”‚ β”‚ β”‚ β”‚ (zenohd) β”‚ β”‚
263
+ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
264
+ β”‚ β”‚ zenoh-ts (WebSocket) │───┼─────┼─► β”‚ β”‚
265
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ Zenoh β”‚
266
+ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
267
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜ β”‚ β”‚ ROS2 (rmw_zenoh_cpp) β”‚ β”‚
268
+ β”‚ β”‚ /cmd_vel /odom ... β”‚ β”‚
269
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
270
+ β”‚ β–Ό β”‚
271
+ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
272
+ β”‚ β”‚ ROBOT HARDWARE β”‚ β”‚
273
+ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
274
+ β”‚ β”‚
275
+ β”” ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ β”˜
276
+
277
+ Transport: Zenoh (WebSocket to Zenoh router; plugin uses zenoh-ts)
278
+ Latency: ~ms
279
+ NAT issue: depends on network β€” router must be reachable from OpenClaw
280
+ ```
281
+
282
+ Set `transport.mode` to `zenoh`, configure `zenoh.routerEndpoint` (e.g.
283
+ `ws://router-host:10000` for zenoh-ts), and optionally `zenoh.domainId` to
284
+ match `ROS_DOMAIN_ID` / rmw_zenoh. The `robot.namespace` config applies to
285
+ topic names (and thus to Zenoh key expressions), e.g. namespace `robot-uuid`
286
+ yields `/robot-uuid/cmd_vel`.
287
+
288
+ ---
289
+
290
+ ## Transport Adapter Abstraction
291
+
292
+ All plugin tools call `getTransport()` instead of directly using a specific
293
+ client library. The `RosTransport` interface (`@agenticros/transport`) provides
294
+ a unified API for all three deployment modes:
295
+
296
+ ```
297
+ Plugin Tools (ros2_publish, ros2_subscribe_once, ...)
298
+ β”‚
299
+ β–Ό
300
+ getTransport(): RosTransport
301
+ β”‚
302
+ β”œβ”€β”€ RosbridgeTransport (Mode B β€” @agenticros/rosbridge-client)
303
+ β”‚ └── WebSocket β†’ rosbridge_server β†’ ROS2 DDS
304
+ β”‚
305
+ β”œβ”€β”€ LocalTransport (Mode A β€” @agenticros/transport-local, stub)
306
+ β”‚ └── rclnodejs β†’ ROS2 DDS directly
307
+ β”‚
308
+ β”œβ”€β”€ WebRTCTransport (Mode C β€” @agenticros/transport-webrtc, stub)
309
+ β”‚ └── WebRTC data channel β†’ agenticros_agent β†’ ROS2 DDS
310
+ β”‚
311
+ └── ZenohTransport (Mode D β€” zenoh-ts)
312
+ └── WebSocket β†’ Zenoh router β†’ ROS2 (rmw_zenoh_cpp)
313
+ ```
314
+
315
+ The `createTransport(config)` factory in `@agenticros/transport` uses dynamic
316
+ `import()` to load the correct adapter by mode, so unused adapters and their
317
+ dependencies are never loaded.
318
+
319
+ ---
320
+
321
+ ## Optional cross-adapter memory
322
+
323
+ When `config.memory.enabled` is true, all four adapters (OpenClaw, Claude Code
324
+ MCP, Claude Desktop MCP, Gemini CLI) register four extra tools β€”
325
+ `memory_remember`, `memory_recall`, `memory_forget`, `memory_status` β€” backed
326
+ by a **shared, file-backed store** namespaced by `robot.namespace`. With the
327
+ `mem0` backend, the vector store lives at `~/.mem0/vector_store.db`, so every
328
+ process on the host reads and writes the same data β€” that is what enables
329
+ true cross-adapter recall (a fact remembered from Claude Desktop is immediately
330
+ recall-able from OpenClaw).
331
+
332
+ The OpenClaw plugin additionally injects a `### Memory` section into each
333
+ chat's system context at `before_agent_start`, containing usage directives
334
+ for the four tools plus a snapshot of up to 10 recently-remembered facts
335
+ (via the `MemoryProvider.recent(namespace, limit)` core method). This lets
336
+ the OpenClaw LLM answer common personal-context questions ("what do I have
337
+ for X?") **without** a tool call, while still using `memory_recall` for
338
+ deeper semantic search.
339
+
340
+ Off by default; see [memory.md](memory.md) for setup, recipes, and
341
+ cross-process verification steps.
342
+
343
+ ---
344
+
345
+ ## Data Flow Example
346
+
347
+ ```
348
+ User (Telegram) AgenticROS Robot
349
+ β”‚ β”‚ β”‚
350
+ β”‚ "Move forward 2 meters" β”‚ β”‚
351
+ │───────────────────────────►│ β”‚
352
+ β”‚ β”‚ β”‚
353
+ β”‚ AI Agent selects ros2_publish β”‚
354
+ β”‚ Safety hook validates (0.5 m/s < 1.0 limit) β”‚
355
+ β”‚ β”‚ β”‚
356
+ β”‚ β”‚ publish /cmd_vel β”‚
357
+ β”‚ │─────────────────────────────►│
358
+ β”‚ β”‚ (via Mode A, B, or C) β”‚ Motors
359
+ β”‚ β”‚ β”‚ engage
360
+ β”‚ β”‚ subscribe /odom β”‚
361
+ β”‚ │◄─────────────────────────────│
362
+ β”‚ β”‚ β”‚
363
+ β”‚ "Done! Moved 2m forward" β”‚ β”‚
364
+ │◄───────────────────────────│ β”‚
365
+ β”‚ β”‚ β”‚
366
+ ```
@@ -0,0 +1,140 @@
1
+ # `agenticros` CLI reference
2
+
3
+ `agenticros` is the single command-line entry point for the AgenticROS
4
+ project. It orchestrates the existing shell scripts (`scripts/start_demo.sh`,
5
+ `scripts/setup_gateway_plugin.sh`, …) and the simulation launchers, and adds
6
+ an interactive menu, a doctor, and a status/logs view on top.
7
+
8
+ ## Install
9
+
10
+ | Audience | Command |
11
+ |---|---|
12
+ | One-off (no install) | `npx agenticros` |
13
+ | Per-user global | `pnpm add -g agenticros` (or `npm install -g agenticros`) |
14
+ | Contributor (repo) | `./agenticros` from the repo root, or `./scripts/install_cli.sh` |
15
+
16
+ The `npx` and `npm` flows ship a snapshot of the entire AgenticROS monorepo
17
+ inside the published tarball. The first `agenticros init` copies that
18
+ snapshot into `~/agenticros` (configurable via `$AGENTICROS_HOME` or
19
+ `--install-dir`), then runs `pnpm install`, `pnpm build`, and `colcon build`
20
+ there. After init, every subsequent `agenticros` invocation operates against
21
+ `~/agenticros` as the workspace root.
22
+
23
+ Contributors working from a clone get a third "workspace mode": the CLI auto-
24
+ detects the `agenticros-monorepo` package.json walking upward from its install
25
+ location and uses the live sources / dist directly.
26
+
27
+ ## Commands
28
+
29
+ ### `agenticros` (no args)
30
+
31
+ Opens the interactive top-level menu. The menu adapts to the doctor's output:
32
+ if any red checks are present, "First-time setup" is moved to the top.
33
+
34
+ ### `agenticros up [target]`
35
+
36
+ Bring up a robot stack. Targets:
37
+
38
+ | Target | What it does |
39
+ |-----------|-----|
40
+ | `real` | Runs `scripts/start_demo.sh`: RealSense camera, motor controller, MCP server. |
41
+ | `sim-amr` | Launches the simulated 2-wheel AMR (Phase 2 - WIP). |
42
+ | `sim-arm` | Launches the simulated UR5e arm + MoveIt2 (Phase 3 - WIP). |
43
+
44
+ Flags:
45
+ - `--ros-distro humble|jazzy|…` override ROS distro detection
46
+ - `--namespace <ns>` override the robot namespace
47
+ - `--rviz` open RViz alongside the sim
48
+ - `--no-camera` skip starting the RealSense camera (real target)
49
+ - `--no-motors` skip starting the motor controller (real target)
50
+
51
+ ### `agenticros down [--keep-camera] [--keep-gateway]`
52
+
53
+ SIGTERMs every process recorded in `/tmp/agenticros-*.pid` and stops the
54
+ `openclaw-gateway.service` user unit (unless `--keep-gateway`). Also cleans
55
+ up stray `gz sim`, `rviz2`, and `parameter_bridge` processes.
56
+
57
+ ### `agenticros init [--force] [--install-dir <path>]`
58
+
59
+ Idempotent first-time setup wizard. Each step queries doctor first and is
60
+ skipped (with a checkmark) when already done:
61
+
62
+ 1. JS workspace deps (`pnpm install`)
63
+ 2. JS workspace build (`pnpm build`)
64
+ 3. ROS 2 workspace build (`colcon build --symlink-install`)
65
+ 4. OpenClaw plugin install (via `scripts/setup_gateway_plugin.sh`)
66
+ 5. Robot config (writes `~/.agenticros/config.json`)
67
+ 6. OpenAI API key (paste once β†’ `scripts/configure_agenticros.sh`)
68
+ 7. Final `agenticros doctor` summary
69
+
70
+ Pass `--force` to re-run every step regardless of state.
71
+
72
+ ### `agenticros doctor [--json]`
73
+
74
+ Runs every health check and prints a coloured table. With `--json`, emits the
75
+ same report as a structured object for CI / scripting:
76
+
77
+ ```json
78
+ {
79
+ "checks": [{ "id": "ros-distro", "label": "...", "severity": "green" }, …],
80
+ "summary": { "green": 10, "yellow": 1, "red": 0 }
81
+ }
82
+ ```
83
+
84
+ Exits non-zero if any check is red.
85
+
86
+ ### `agenticros status [--json]`
87
+
88
+ Shows running components (camera / sim / mcp / rosbridge / openclaw-gateway)
89
+ and the last-used mode/namespace from `~/.agenticros/cli-state.json`.
90
+
91
+ ### `agenticros logs [target]`
92
+
93
+ Tails one of: `camera`, `mcp`, `sim`, `rosbridge`, `gateway`. Without a
94
+ target, prints the list of available log targets. Defaults to follow mode
95
+ (`-f`); pass `--no-follow` to disable.
96
+
97
+ ### `agenticros config [action] [key=value]`
98
+
99
+ Read or edit `~/.agenticros/config.json`. Actions:
100
+
101
+ | Action | Example | Effect |
102
+ |---|---|---|
103
+ | `show` | `agenticros config show` (or just `agenticros config`) | Pretty-print the file. |
104
+ | `set` | `agenticros config set robot.namespace=sim_robot` | Write a single key (dot-paths supported). |
105
+ | `edit` | `agenticros config edit` | Open in `$EDITOR`. |
106
+ | `reset` | `agenticros config reset` | Delete the file (with confirm). |
107
+
108
+ ## Where state lives
109
+
110
+ | Path | Owner | Purpose |
111
+ |---|---|---|
112
+ | `~/.agenticros/config.json` | User | AgenticROS runtime config (transport mode, namespace, safety limits). |
113
+ | `~/.agenticros/cli-state.json` | CLI | Last-used mode/namespace for the menu's "(yesterday)" hint. |
114
+ | `~/agenticros/` | CLI (npm-install mode) | Copy of the monorepo, with built dist + colcon install. |
115
+ | `/tmp/agenticros-*.pid` | CLI | PIDs of background processes the CLI spawned. |
116
+ | `/tmp/agenticros-*.log` | CLI | Stdout/stderr from those processes. |
117
+ | `~/.openclaw/openclaw.json` | OpenClaw gateway | Plugin registration + per-plugin config (incl. AgenticROS). |
118
+
119
+ ## Environment variables
120
+
121
+ | Variable | Default | Purpose |
122
+ |---|---|---|
123
+ | `AGENTICROS_HOME` | `~/agenticros` | Install root in npm-install mode. |
124
+ | `AGENTICROS_CONFIG_PATH` | (auto) | Override the path to `~/.agenticros/config.json`. |
125
+ | `AGENTICROS_ROBOT_NAMESPACE` | (from config) | Force a robot namespace at runtime. |
126
+ | `OPENAI_API_KEY` | (none) | If set, doctor reports green without requiring OpenClaw profile config. |
127
+
128
+ ## Troubleshooting
129
+
130
+ - **`doctor` shows red checks** β†’ run `agenticros init` to walk through every
131
+ step. Re-run `doctor` afterward.
132
+ - **`up` exits immediately** β†’ `agenticros logs <component>` (the CLI now
133
+ records where every child wrote its output) and read the error in context.
134
+ - **`up sim-amr` warns "scripts/sim/run_sim.sh not found"** β†’ simulation
135
+ support is delivered in CLI Phase 2; until then the message tells you when
136
+ to expect it.
137
+ - **`pnpm --filter agenticros build` builds two packages** β†’ check the OpenClaw
138
+ plugin's `packages/agenticros/package.json`; its npm name should be
139
+ `@agenticros/openclaw`, not `agenticros`. If it's wrong, `pnpm --filter` will
140
+ match both. (Fixed in this repo as of June 2026.)