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,232 @@
1
+ /**
2
+ * `agenticros doctor` - environment health check.
3
+ *
4
+ * Runs every check, prints a coloured table, exits non-zero if any check is
5
+ * red. With --json, emits a structured JSON object suitable for CI.
6
+ *
7
+ * The same check infrastructure powers the menu's "needs first-time setup"
8
+ * detection (`hasRedChecks()`) so the UX stays consistent.
9
+ */
10
+ import { existsSync, statSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { execa } from "execa";
13
+ import { getCliPaths } from "../util/paths.js";
14
+ import { detectRosDistro, hasGazeboHarmonic } from "../util/env.js";
15
+ import { colors, header, ok, warn, err, info } from "../util/logger.js";
16
+ export async function doctorCommand(opts) {
17
+ const report = await runDoctorChecks();
18
+ if (opts.json) {
19
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
20
+ }
21
+ else {
22
+ header("AgenticROS doctor");
23
+ for (const c of report.checks) {
24
+ const icon = c.severity === "green"
25
+ ? colors.green("✓")
26
+ : c.severity === "yellow"
27
+ ? colors.yellow("○")
28
+ : colors.red("✗");
29
+ const labelText = `${icon} ${c.label}`;
30
+ const detail = c.detail ? ` ${colors.dim(c.detail)}` : "";
31
+ process.stdout.write(`${labelText}${detail}\n`);
32
+ if (c.severity === "red" && c.hint) {
33
+ process.stdout.write(` ${colors.dim("→ " + c.hint)}\n`);
34
+ }
35
+ }
36
+ const s = report.summary;
37
+ process.stdout.write(`\n${colors.bold("Summary:")} ${colors.green(`${s.green} green`)}, ${colors.yellow(`${s.yellow} yellow`)}, ${colors.red(`${s.red} red`)}\n`);
38
+ if (s.red > 0) {
39
+ info("Try `agenticros init` to fix the red checks.");
40
+ }
41
+ }
42
+ return report.summary.red > 0 ? 1 : 0;
43
+ }
44
+ /** Returns true if any red check is present — used by the menu to reorder choices. */
45
+ export async function hasRedChecks() {
46
+ const report = await runDoctorChecks();
47
+ return report.summary.red > 0;
48
+ }
49
+ export async function runDoctorChecks() {
50
+ const paths = getCliPaths();
51
+ const checks = [];
52
+ // ROS distro.
53
+ const ros = detectRosDistro();
54
+ if (ros.distro) {
55
+ checks.push({
56
+ id: "ros-distro",
57
+ label: `ROS 2 distro detected (${ros.distro})`,
58
+ severity: "green",
59
+ });
60
+ }
61
+ else {
62
+ checks.push({
63
+ id: "ros-distro",
64
+ label: "ROS 2 not detected",
65
+ severity: "red",
66
+ hint: "Install ROS 2 Humble or Jazzy: https://docs.ros.org/en/humble/Installation.html",
67
+ });
68
+ }
69
+ // pnpm + node.
70
+ try {
71
+ const { stdout } = await execa("node", ["--version"], { reject: false });
72
+ const ver = stdout.trim().replace(/^v/, "");
73
+ const major = Number(ver.split(".")[0]);
74
+ checks.push({
75
+ id: "node",
76
+ label: `Node ${ver}`,
77
+ severity: major >= 20 ? "green" : "yellow",
78
+ hint: major >= 20 ? undefined : "AgenticROS targets Node >= 20.",
79
+ });
80
+ }
81
+ catch {
82
+ checks.push({
83
+ id: "node",
84
+ label: "Node not installed",
85
+ severity: "red",
86
+ hint: "Install Node 20+ from https://nodejs.org",
87
+ });
88
+ }
89
+ // Workspace built (workspace mode only).
90
+ if (paths.workspaceMode) {
91
+ const installSetup = join(paths.repoRoot, "ros2_ws", "install", "setup.bash");
92
+ checks.push({
93
+ id: "ros2-ws-built",
94
+ label: "ros2_ws colcon-built",
95
+ severity: existsSync(installSetup) ? "green" : "red",
96
+ hint: existsSync(installSetup)
97
+ ? undefined
98
+ : "Build with: cd ros2_ws && colcon build --symlink-install",
99
+ });
100
+ const nm = join(paths.repoRoot, "node_modules");
101
+ checks.push({
102
+ id: "js-deps",
103
+ label: "JS workspace deps installed",
104
+ severity: existsSync(nm) ? "green" : "red",
105
+ hint: existsSync(nm) ? undefined : "Run: pnpm install",
106
+ });
107
+ }
108
+ // MCP server built.
109
+ const mcpIndex = join(paths.mcpDistDir, "index.js");
110
+ if (existsSync(mcpIndex)) {
111
+ const ageDays = (Date.now() - statSync(mcpIndex).mtimeMs) / 86_400_000;
112
+ checks.push({
113
+ id: "mcp-built",
114
+ label: "@agenticros/claude-code MCP server built",
115
+ severity: ageDays < 30 ? "green" : "yellow",
116
+ detail: `dist age: ${Math.round(ageDays)} day(s)`,
117
+ hint: ageDays >= 30 ? "Rebuild with `pnpm --filter @agenticros/claude-code build`" : undefined,
118
+ });
119
+ }
120
+ else {
121
+ checks.push({
122
+ id: "mcp-built",
123
+ label: "@agenticros/claude-code MCP server NOT built",
124
+ severity: "red",
125
+ hint: paths.workspaceMode
126
+ ? "Run: pnpm --filter @agenticros/claude-code build"
127
+ : "Re-run `agenticros init` to repopulate the bundled MCP dist.",
128
+ });
129
+ }
130
+ // Disk free.
131
+ try {
132
+ const { stdout } = await execa("df", ["-Pk", paths.workspaceMode ? paths.repoRoot : paths.installDir], {
133
+ reject: false,
134
+ });
135
+ const lines = stdout.trim().split("\n");
136
+ const last = lines[lines.length - 1] ?? "";
137
+ const cols = last.trim().split(/\s+/);
138
+ const availKb = Number(cols[3]);
139
+ if (Number.isFinite(availKb)) {
140
+ const availGb = availKb / 1_048_576;
141
+ const sev = availGb >= 5 ? "green" : availGb >= 2 ? "yellow" : "red";
142
+ checks.push({
143
+ id: "disk",
144
+ label: `Disk free: ${availGb.toFixed(1)} GB`,
145
+ severity: sev,
146
+ hint: sev === "red"
147
+ ? "Free at least 2 GB before colcon build / pnpm install."
148
+ : sev === "yellow"
149
+ ? "Disk is getting tight; consider cleaning ~/.cache/pip or large docker images."
150
+ : undefined,
151
+ });
152
+ }
153
+ }
154
+ catch {
155
+ // skip if df missing
156
+ }
157
+ // Gazebo (informational - only red for sim modes).
158
+ checks.push({
159
+ id: "gz",
160
+ label: hasGazeboHarmonic() ? "Gazebo Harmonic available" : "Gazebo not installed",
161
+ severity: hasGazeboHarmonic() ? "green" : "yellow",
162
+ hint: hasGazeboHarmonic()
163
+ ? undefined
164
+ : "Required only for simulation. Install with: sudo apt install gz-harmonic ros-humble-ros-gz",
165
+ });
166
+ // OpenAI key.
167
+ const home = process.env["HOME"] ?? "";
168
+ const authFile = join(home, ".openclaw", "agents", "main", "agent", "auth-profiles.json");
169
+ const haveEnv = (process.env["OPENAI_API_KEY"] ?? "").length > 10;
170
+ const haveFile = existsSync(authFile);
171
+ checks.push({
172
+ id: "openai-key",
173
+ label: haveEnv ? "OpenAI key in env" : haveFile ? "OpenAI key in OpenClaw profiles" : "OpenAI key not configured",
174
+ severity: haveEnv || haveFile ? "green" : "yellow",
175
+ hint: haveEnv || haveFile
176
+ ? undefined
177
+ : "Set OPENAI_API_KEY in env, or run `agenticros init` to configure it interactively.",
178
+ });
179
+ // OpenClaw plugin.
180
+ const ocConfig = join(home, ".openclaw", "openclaw.json");
181
+ checks.push({
182
+ id: "openclaw-config",
183
+ label: existsSync(ocConfig) ? "OpenClaw config present" : "OpenClaw config missing",
184
+ severity: existsSync(ocConfig) ? "green" : "red",
185
+ hint: existsSync(ocConfig) ? undefined : "Run `agenticros init` to install the OpenClaw plugin.",
186
+ });
187
+ // OpenClaw gateway service.
188
+ try {
189
+ const { exitCode } = await execa("systemctl", ["--user", "is-active", "openclaw-gateway.service"], { reject: false });
190
+ checks.push({
191
+ id: "openclaw-gateway",
192
+ label: exitCode === 0
193
+ ? "OpenClaw gateway service active"
194
+ : "OpenClaw gateway service not running",
195
+ severity: exitCode === 0 ? "green" : "yellow",
196
+ hint: exitCode === 0
197
+ ? undefined
198
+ : "Start with: systemctl --user start openclaw-gateway.service",
199
+ });
200
+ }
201
+ catch {
202
+ // systemctl missing - skip
203
+ }
204
+ // RealSense (informational).
205
+ try {
206
+ const { stdout, exitCode } = await execa("lsusb", { reject: false });
207
+ if (exitCode === 0) {
208
+ const hit = /Intel.*RealSense|8086:0b/i.test(stdout);
209
+ checks.push({
210
+ id: "realsense",
211
+ label: hit ? "Intel RealSense detected" : "No Intel RealSense detected",
212
+ severity: hit ? "green" : "yellow",
213
+ hint: hit
214
+ ? undefined
215
+ : "Only required for `agenticros up real` with the default camera setup.",
216
+ });
217
+ }
218
+ }
219
+ catch {
220
+ // lsusb missing - skip
221
+ }
222
+ const summary = checks.reduce((acc, c) => {
223
+ acc[c.severity] += 1;
224
+ return acc;
225
+ }, { green: 0, yellow: 0, red: 0 });
226
+ return { checks, summary };
227
+ }
228
+ // Silence unused warnings for utilities the doctor module re-exports.
229
+ void ok;
230
+ void warn;
231
+ void err;
232
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `agenticros down` - stop AgenticROS components this CLI brought up.
3
+ *
4
+ * Kills processes recorded in /tmp/agenticros-*.pid (sim, camera, mcp,
5
+ * rosbridge) plus stray gz / rviz / parameter_bridge. The OpenClaw gateway
6
+ * service is a persistent host service used by Claude Code / MCP - leave it
7
+ * running unless the user explicitly passes --stop-gateway.
8
+ */
9
+ export interface DownOptions {
10
+ keepCamera?: boolean;
11
+ /** Default false. When true, also stops openclaw-gateway.service. */
12
+ stopGateway?: boolean;
13
+ }
14
+ export declare function downCommand(opts: DownOptions): Promise<void>;
15
+ //# sourceMappingURL=down.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.d.ts","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAID,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiClE"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * `agenticros down` - stop AgenticROS components this CLI brought up.
3
+ *
4
+ * Kills processes recorded in /tmp/agenticros-*.pid (sim, camera, mcp,
5
+ * rosbridge) plus stray gz / rviz / parameter_bridge. The OpenClaw gateway
6
+ * service is a persistent host service used by Claude Code / MCP - leave it
7
+ * running unless the user explicitly passes --stop-gateway.
8
+ */
9
+ import { execa } from "execa";
10
+ import { clearPid, isPidAlive, killPid } from "../util/pidfile.js";
11
+ import { err, header, info, ok, warn, withSpinner } from "../util/logger.js";
12
+ const STOPPABLE = ["sim", "mcp", "rosbridge", "camera"];
13
+ export async function downCommand(opts) {
14
+ header("AgenticROS - shutting down");
15
+ let stoppedAny = false;
16
+ for (const name of STOPPABLE) {
17
+ if (name === "camera" && opts.keepCamera) {
18
+ info("Skipping camera (--keep-camera).");
19
+ continue;
20
+ }
21
+ if (!isPidAlive(name))
22
+ continue;
23
+ stoppedAny = true;
24
+ await withSpinner(`Stopping ${name}`, async () => {
25
+ const pid = killPid(name, "SIGTERM");
26
+ if (pid === undefined)
27
+ return;
28
+ await waitForExit(pid);
29
+ clearPid(name);
30
+ });
31
+ }
32
+ // Mop up any stray sim subprocesses that did not write a pidfile (children of
33
+ // ros2 launch typically inherit termination, but be defensive).
34
+ await tryKill(["gz sim", "ign gazebo", "rviz2", "parameter_bridge"]);
35
+ if (opts.stopGateway) {
36
+ await stopGatewayService();
37
+ }
38
+ else {
39
+ info("Leaving openclaw-gateway running (use --stop-gateway to also stop it).");
40
+ }
41
+ if (!stoppedAny && !opts.stopGateway) {
42
+ info("Nothing to stop.");
43
+ }
44
+ ok("Done.");
45
+ }
46
+ async function waitForExit(pid, timeoutMs = 5000) {
47
+ const deadline = Date.now() + timeoutMs;
48
+ while (Date.now() < deadline) {
49
+ try {
50
+ process.kill(pid, 0);
51
+ }
52
+ catch {
53
+ return;
54
+ }
55
+ await new Promise((r) => setTimeout(r, 100));
56
+ }
57
+ // Force-kill after timeout.
58
+ try {
59
+ process.kill(pid, "SIGKILL");
60
+ }
61
+ catch {
62
+ // probably gone
63
+ }
64
+ }
65
+ async function tryKill(patterns) {
66
+ for (const pattern of patterns) {
67
+ try {
68
+ await execa("pkill", ["-TERM", "-f", pattern], { reject: false });
69
+ }
70
+ catch {
71
+ // ignore - pkill missing or no matches
72
+ }
73
+ }
74
+ }
75
+ async function stopGatewayService() {
76
+ try {
77
+ const { exitCode } = await execa("systemctl", ["--user", "is-active", "openclaw-gateway.service"], { reject: false });
78
+ if (exitCode !== 0)
79
+ return; // not active or doesn't exist
80
+ await withSpinner("Stopping openclaw-gateway.service", async () => {
81
+ await execa("systemctl", ["--user", "stop", "openclaw-gateway.service"], {
82
+ reject: false,
83
+ });
84
+ });
85
+ }
86
+ catch (e) {
87
+ warn(`Could not stop openclaw-gateway.service: ${e instanceof Error ? e.message : String(e)}`);
88
+ }
89
+ }
90
+ void err; // silence "unused" warning on broad imports until full impl
91
+ //# sourceMappingURL=down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"down.js","sourceRoot":"","sources":["../../src/commands/down.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `agenticros init` - first-time setup wizard.
3
+ *
4
+ * Idempotent: every step queries doctor first and is skipped (with a green
5
+ * checkmark) when the corresponding check already passes. Steps:
6
+ * 1. Workspace deps -> pnpm install
7
+ * 2. Workspace build -> pnpm build
8
+ * 3. colcon workspace -> ros2_ws colcon build
9
+ * 4. OpenClaw plugin -> scripts/setup_gateway_plugin.sh
10
+ * 5. Robot config -> prompt namespace + transport, write ~/.agenticros/config.json
11
+ * 6. OpenAI key -> prompt + scripts/configure_agenticros.sh
12
+ * 7. Doctor summary
13
+ *
14
+ * Reuses the existing shell scripts as subprocesses (no logic duplication).
15
+ */
16
+ export interface InitOptions {
17
+ force?: boolean;
18
+ installDir?: string;
19
+ }
20
+ export declare function initCommand(opts: InitOptions): Promise<void>;
21
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkHlE"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * `agenticros init` - first-time setup wizard.
3
+ *
4
+ * Idempotent: every step queries doctor first and is skipped (with a green
5
+ * checkmark) when the corresponding check already passes. Steps:
6
+ * 1. Workspace deps -> pnpm install
7
+ * 2. Workspace build -> pnpm build
8
+ * 3. colcon workspace -> ros2_ws colcon build
9
+ * 4. OpenClaw plugin -> scripts/setup_gateway_plugin.sh
10
+ * 5. Robot config -> prompt namespace + transport, write ~/.agenticros/config.json
11
+ * 6. OpenAI key -> prompt + scripts/configure_agenticros.sh
12
+ * 7. Doctor summary
13
+ *
14
+ * Reuses the existing shell scripts as subprocesses (no logic duplication).
15
+ */
16
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { confirm, input, password, select } from "@inquirer/prompts";
19
+ import { execa } from "execa";
20
+ import { runDoctorChecks } from "./doctor.js";
21
+ import { getCliPaths, resetPathsCache } from "../util/paths.js";
22
+ import { header, info, ok, warn, err, dim, withSpinner } from "../util/logger.js";
23
+ import { writeState } from "../util/state.js";
24
+ export async function initCommand(opts) {
25
+ header("AgenticROS first-time setup");
26
+ let paths = getCliPaths();
27
+ const targetInstallDir = opts.installDir ?? paths.installDir;
28
+ if (paths.mode === "workspace") {
29
+ info("Workspace mode detected - using the live repository at:");
30
+ dim(` ${paths.repoRoot}`);
31
+ }
32
+ else if (paths.mode === "installed") {
33
+ info("Installed mode detected - using existing install at:");
34
+ dim(` ${paths.repoRoot}`);
35
+ if (opts.force) {
36
+ warn("--force given; refreshing install dir from the published bundle.");
37
+ await syncBundleToInstallDir(targetInstallDir, { overwrite: true });
38
+ }
39
+ }
40
+ else {
41
+ info("Bundle mode detected. Copying the published snapshot to:");
42
+ dim(` ${targetInstallDir}`);
43
+ await syncBundleToInstallDir(targetInstallDir, { overwrite: opts.force === true });
44
+ resetPathsCache();
45
+ paths = getCliPaths();
46
+ if (paths.mode === "bundle") {
47
+ err(`Failed to set up install dir at ${targetInstallDir}. The snapshot was ` +
48
+ "copied but path detection still reports bundle mode - this is a CLI bug.");
49
+ process.exit(1);
50
+ }
51
+ }
52
+ const repoRoot = paths.repoRoot;
53
+ const before = await runDoctorChecks();
54
+ // Step: workspace deps.
55
+ if (opts.force || !nodeModulesPresent(repoRoot)) {
56
+ await runStep("Installing JS workspace dependencies (pnpm install)", async () => {
57
+ await execa("pnpm", ["install"], {
58
+ cwd: repoRoot,
59
+ stdio: "inherit",
60
+ });
61
+ });
62
+ }
63
+ else {
64
+ ok("JS workspace deps already installed (skip).");
65
+ }
66
+ // Step: build TS workspace.
67
+ if (opts.force || !mcpDistExists()) {
68
+ await runStep("Building TypeScript workspace (pnpm build)", async () => {
69
+ await execa("pnpm", ["build"], { cwd: repoRoot, stdio: "inherit" });
70
+ });
71
+ }
72
+ else {
73
+ ok("TypeScript dist already built (skip).");
74
+ }
75
+ // Step: colcon workspace.
76
+ const ros2WsRoot = join(repoRoot, "ros2_ws");
77
+ if (opts.force || !colconBuilt(ros2WsRoot)) {
78
+ await runStep("Building ROS 2 workspace (colcon)", async () => {
79
+ await runShell(`mkdir -p "${ros2WsRoot}" && cd "${ros2WsRoot}" && \
80
+ . /opt/ros/$(ls /opt/ros 2>/dev/null | head -1)/setup.bash && \
81
+ colcon build --symlink-install`);
82
+ });
83
+ }
84
+ else {
85
+ ok("ROS 2 workspace already built (skip).");
86
+ }
87
+ // Step: OpenClaw plugin install.
88
+ if (opts.force || !openclawPluginInstalled()) {
89
+ const wantPlugin = await confirm({
90
+ message: "Install the OpenClaw plugin now? (recommended)",
91
+ default: true,
92
+ });
93
+ if (wantPlugin) {
94
+ const script = join(paths.scriptsDir, "setup_gateway_plugin.sh");
95
+ if (existsSync(script)) {
96
+ await runStep("Installing OpenClaw plugin", async () => {
97
+ await runShell(`bash "${script}"`);
98
+ });
99
+ }
100
+ else {
101
+ warn(`setup_gateway_plugin.sh not found at ${script}; skipping.`);
102
+ }
103
+ }
104
+ }
105
+ else {
106
+ ok("OpenClaw plugin already installed (skip).");
107
+ }
108
+ // Step: robot config.
109
+ if (opts.force || !userConfigExists()) {
110
+ await promptAndWriteRobotConfig();
111
+ }
112
+ else {
113
+ ok("Robot config already exists at ~/.agenticros/config.json (skip).");
114
+ }
115
+ // Step: OpenAI key.
116
+ if (opts.force || !openAiKeyConfigured(before)) {
117
+ await promptAndConfigureOpenAi();
118
+ }
119
+ else {
120
+ ok("OpenAI API key already configured (skip).");
121
+ }
122
+ // Step: doctor summary.
123
+ info("Running doctor for a final health summary…");
124
+ const after = await runDoctorChecks();
125
+ const red = after.checks.filter((c) => c.severity === "red");
126
+ if (red.length === 0) {
127
+ ok("Setup complete. Try `agenticros up real` (or `agenticros up sim-amr`).");
128
+ }
129
+ else {
130
+ warn(`${red.length} check(s) still red. Inspect with: agenticros doctor`);
131
+ }
132
+ writeState({});
133
+ }
134
+ async function runStep(label, body) {
135
+ info(label);
136
+ try {
137
+ await body();
138
+ ok(label);
139
+ }
140
+ catch (e) {
141
+ err(`${label} failed: ${e instanceof Error ? e.message : String(e)}`);
142
+ process.exit(1);
143
+ }
144
+ }
145
+ async function runShell(cmd) {
146
+ await execa("bash", ["-lc", cmd], { stdio: "inherit" });
147
+ }
148
+ function nodeModulesPresent(repoRoot) {
149
+ return existsSync(join(repoRoot, "node_modules"));
150
+ }
151
+ function mcpDistExists() {
152
+ return existsSync(getCliPaths().mcpDistDir);
153
+ }
154
+ function colconBuilt(ws) {
155
+ return existsSync(join(ws, "install", "setup.bash"));
156
+ }
157
+ function openclawPluginInstalled() {
158
+ const home = process.env["HOME"] ?? "";
159
+ return existsSync(join(home, ".openclaw", "openclaw.json"));
160
+ }
161
+ function userConfigExists() {
162
+ return existsSync(join(getCliPaths().userDataDir, "config.json"));
163
+ }
164
+ function openAiKeyConfigured(_before) {
165
+ // Simple heuristic: env var set OR auth-profiles file present + non-empty.
166
+ if ((process.env["OPENAI_API_KEY"] ?? "").length > 0)
167
+ return true;
168
+ const home = process.env["HOME"] ?? "";
169
+ const authFile = join(home, ".openclaw", "agents", "main", "agent", "auth-profiles.json");
170
+ return existsSync(authFile);
171
+ }
172
+ async function promptAndWriteRobotConfig() {
173
+ const isSim = (await select({
174
+ message: "Which environment are you setting up first?",
175
+ choices: [
176
+ { name: "Real robot (RealSense, motors, local DDS transport)", value: "real" },
177
+ { name: "Simulation (Gazebo Harmonic; works without robot hardware)", value: "sim" },
178
+ ],
179
+ default: "sim",
180
+ })) === "sim";
181
+ const defaultNs = isSim ? "sim_robot" : "my_robot";
182
+ const namespace = await input({
183
+ message: "Robot namespace (used as topic prefix, e.g. /<namespace>/cmd_vel)",
184
+ default: defaultNs,
185
+ });
186
+ const userData = getCliPaths().userDataDir;
187
+ mkdirSync(userData, { recursive: true });
188
+ const cfg = {
189
+ transport: { mode: "local" },
190
+ robot: {
191
+ namespace,
192
+ name: isSim ? "Sim Robot" : "My Robot",
193
+ cameraTopic: "/camera/camera/color/image_raw",
194
+ },
195
+ safety: {
196
+ maxLinearVelocity: isSim ? 0.5 : 1.0,
197
+ maxAngularVelocity: isSim ? 1.0 : 1.5,
198
+ },
199
+ teleop: {
200
+ cmdVelTopic: "/cmd_vel",
201
+ speedDefault: isSim ? 0.2 : 0.3,
202
+ },
203
+ };
204
+ writeFileSync(join(userData, "config.json"), JSON.stringify(cfg, null, 2));
205
+ ok(`Wrote ~/.agenticros/config.json (namespace=${namespace}).`);
206
+ writeState({ lastNamespace: namespace });
207
+ }
208
+ async function promptAndConfigureOpenAi() {
209
+ const haveKey = await confirm({
210
+ message: "Do you have an OpenAI API key you'd like to configure now?",
211
+ default: true,
212
+ });
213
+ if (!haveKey) {
214
+ warn("Skipping OpenAI setup. You can run `agenticros config set openai.apiKey=sk-...` later.");
215
+ return;
216
+ }
217
+ const key = await password({ message: "Paste your OpenAI API key (input hidden)" });
218
+ if (!key || !key.startsWith("sk-")) {
219
+ warn("That doesn't look like a key. Skipping (config can be set later).");
220
+ return;
221
+ }
222
+ const script = join(getCliPaths().scriptsDir, "configure_agenticros.sh");
223
+ if (!existsSync(script)) {
224
+ warn(`configure_agenticros.sh not found at ${script}; key was not persisted.`);
225
+ return;
226
+ }
227
+ await withSpinner("Storing OpenAI key via configure_agenticros.sh", async () => {
228
+ await execa("bash", [script], {
229
+ env: { ...process.env, OPENAI_API_KEY: key },
230
+ stdio: "pipe",
231
+ });
232
+ });
233
+ }
234
+ /**
235
+ * Copy the bundled monorepo snapshot (`packages/agenticros-cli/runtime/`) into
236
+ * the user's install dir (default ~/agenticros) so colcon and pnpm have a full
237
+ * tree to operate on. Idempotent by default; pass overwrite to clobber.
238
+ */
239
+ async function syncBundleToInstallDir(targetDir, opts = {}) {
240
+ const paths = getCliPaths();
241
+ const source = paths.bundleDir;
242
+ if (!source || !existsSync(source)) {
243
+ err("No bundled runtime/ found in this CLI install. Either rebuild with " +
244
+ "`pnpm --filter agenticros pack:runtime`, or run `agenticros init` from a " +
245
+ "monorepo checkout.");
246
+ process.exit(1);
247
+ }
248
+ if (existsSync(targetDir) && !opts.overwrite) {
249
+ ok(`Install directory ${targetDir} already exists (skipping copy).`);
250
+ return;
251
+ }
252
+ await withSpinner(`Copying bundled snapshot to ${targetDir}`, async () => {
253
+ mkdirSync(targetDir, { recursive: true });
254
+ // `cp -a SRC/. DEST` copies SRC's contents directly into DEST (preserving
255
+ // hidden files like .npmrc), matching the live-monorepo layout exactly.
256
+ await execa("cp", ["-a", `${source}/.`, targetDir]);
257
+ });
258
+ }
259
+ //# sourceMappingURL=init.js.map