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,126 @@
1
+ /**
2
+ * Sample distance (meters) from a ROS2 depth image topic.
3
+ * Copied from OpenClaw adapter so we don't depend on the full plugin.
4
+ */
5
+ import { ROS_MSG_IMAGE, coerceRosImageDataToBuffer, normalizeDepthImageEncoding, rosBoolField, rosNumericField, rosStringField, } from "@agenticros/ros-camera";
6
+ function depthImageDataBytes(data) {
7
+ try {
8
+ return new Uint8Array(coerceRosImageDataToBuffer(data));
9
+ }
10
+ catch (e) {
11
+ const hint = e instanceof Error ? e.message : String(e);
12
+ const kind = data == null
13
+ ? "null"
14
+ : `${typeof data}${typeof data === "object" && data !== null ? ` (${data.constructor?.name ?? "Object"})` : ""}`;
15
+ throw new Error(`Depth image bytes: ${hint} (data field: ${kind})`);
16
+ }
17
+ }
18
+ function bytesPerPixelForDepthEncoding(encoding) {
19
+ return normalizeDepthImageEncoding(encoding) === "32FC1" ? 4 : 2;
20
+ }
21
+ const DEPTH_SAMPLE_MAX_M = 40;
22
+ const DEPTH_REPORT_PERCENTILE = 12;
23
+ function sanitizeDepthSamplesMeters(values) {
24
+ return values.filter((v) => Number.isFinite(v) && v > 0 && v <= DEPTH_SAMPLE_MAX_M);
25
+ }
26
+ function percentileLowerSorted(sortedAsc, p) {
27
+ const n = sortedAsc.length;
28
+ if (n === 0)
29
+ return NaN;
30
+ if (n === 1)
31
+ return sortedAsc[0];
32
+ const pp = Math.max(0, Math.min(100, p));
33
+ const idx = Math.min(n - 1, Math.floor((pp / 100) * n));
34
+ return sortedAsc[idx];
35
+ }
36
+ export function sampleDepthMeters(width, height, step, encoding, data, centerFraction = 0.3, isBigEndian = false) {
37
+ const enc = normalizeDepthImageEncoding(encoding);
38
+ const values = [];
39
+ const cx = width / 2;
40
+ const cy = height / 2;
41
+ const halfW = Math.max(1, Math.floor((width * centerFraction) / 2));
42
+ const halfH = Math.max(1, Math.floor((height * centerFraction) / 2));
43
+ const x0 = Math.max(0, Math.floor(cx - halfW));
44
+ const x1 = Math.min(width, Math.floor(cx + halfW));
45
+ const y0 = Math.max(0, Math.floor(cy - halfH));
46
+ const y1 = Math.min(height, Math.floor(cy + halfH));
47
+ if (enc === "16UC1") {
48
+ for (let y = y0; y < y1; y++) {
49
+ for (let x = x0; x < x1; x++) {
50
+ const off = y * step + x * 2;
51
+ if (off + 2 > data.length)
52
+ continue;
53
+ const lo = data[off];
54
+ const hi = data[off + 1];
55
+ const v = isBigEndian ? (lo << 8) | hi : (hi << 8) | lo;
56
+ if (v > 0)
57
+ values.push(v / 1000);
58
+ }
59
+ }
60
+ }
61
+ else if (enc === "32FC1") {
62
+ for (let y = y0; y < y1; y++) {
63
+ for (let x = x0; x < x1; x++) {
64
+ const off = y * step + x * 4;
65
+ if (off + 4 > data.length)
66
+ continue;
67
+ const v = new DataView(data.buffer, data.byteOffset + off, 4).getFloat32(0, !isBigEndian);
68
+ if (Number.isFinite(v) && v > 0)
69
+ values.push(v);
70
+ }
71
+ }
72
+ }
73
+ else {
74
+ throw new Error(`Unsupported depth encoding: "${encoding}" (interpreted as "${enc}"). Use 16UC1/mono16 (mm) or 32FC1 (m).`);
75
+ }
76
+ return values;
77
+ }
78
+ function median(sorted) {
79
+ if (sorted.length === 0)
80
+ return NaN;
81
+ const m = sorted.length >> 1;
82
+ if (sorted.length % 2 === 1)
83
+ return sorted[m];
84
+ return (sorted[m - 1] + sorted[m]) / 2;
85
+ }
86
+ export async function getDepthDistance(transport, topic, timeoutMs = 5000) {
87
+ const result = await new Promise((resolve, reject) => {
88
+ const sub = transport.subscribe({ topic, type: ROS_MSG_IMAGE }, (msg) => {
89
+ clearTimeout(timer);
90
+ sub.unsubscribe();
91
+ resolve(msg);
92
+ });
93
+ const timer = setTimeout(() => {
94
+ sub.unsubscribe();
95
+ reject(new Error(`Depth snapshot timeout on ${topic} (${timeoutMs}ms). No sensor_msgs/Image received—check topic and that it publishes raw depth (not CompressedImage only). With Zenoh, check the gateway log for CDR decode warnings.`));
96
+ }, timeoutMs);
97
+ });
98
+ const encoding = normalizeDepthImageEncoding(rosStringField(result.encoding, "16UC1"));
99
+ const bpp = bytesPerPixelForDepthEncoding(encoding);
100
+ const width = rosNumericField(result.width, "width");
101
+ const height = rosNumericField(result.height, "height");
102
+ const step = result.step != null && result.step !== ""
103
+ ? rosNumericField(result.step, "step")
104
+ : width * bpp;
105
+ const isBigEndian = rosBoolField(result.is_bigendian);
106
+ const data = depthImageDataBytes(result.data);
107
+ const values = sanitizeDepthSamplesMeters(sampleDepthMeters(width, height, step, encoding, data, 0.3, isBigEndian));
108
+ const sorted = values.slice().sort((a, b) => a - b);
109
+ const distance_m = percentileLowerSorted(sorted, DEPTH_REPORT_PERCENTILE);
110
+ const median_m = median(sorted);
111
+ const min_m = sorted.length ? sorted[0] : NaN;
112
+ const max_m = sorted.length ? sorted[sorted.length - 1] : NaN;
113
+ return {
114
+ distance_m: Math.round(distance_m * 1000) / 1000,
115
+ median_m: Math.round(median_m * 1000) / 1000,
116
+ valid: sorted.length > 0 && Number.isFinite(distance_m),
117
+ topic,
118
+ encoding,
119
+ width,
120
+ height,
121
+ sample_count: sorted.length,
122
+ min_m: Math.round(min_m * 1000) / 1000,
123
+ max_m: Math.round(max_m * 1000) / 1000,
124
+ };
125
+ }
126
+ //# sourceMappingURL=depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"depth.js","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * COCO 80-class names (index = YOLOv8 class ID). Lower-cased for lookup.
3
+ */
4
+ export declare const COCO_CLASSES: readonly ["person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch", "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"];
5
+ export declare function resolveCocoClassId(name: string): number | null;
6
+ //# sourceMappingURL=coco-classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coco-classes.d.ts","sourceRoot":"","sources":["../../src/find-object/coco-classes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,YAAY,w2BAaf,CAAC;AAeX,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK9D"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * COCO 80-class names (index = YOLOv8 class ID). Lower-cased for lookup.
3
+ */
4
+ export const COCO_CLASSES = [
5
+ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck",
6
+ "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench",
7
+ "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra",
8
+ "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee",
9
+ "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove",
10
+ "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup",
11
+ "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange",
12
+ "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch",
13
+ "potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse",
14
+ "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink",
15
+ "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier",
16
+ "toothbrush",
17
+ ];
18
+ const ALIASES = {
19
+ phone: "cell phone",
20
+ cellphone: "cell phone",
21
+ mobile: "cell phone",
22
+ smartphone: "cell phone",
23
+ tv: "tv",
24
+ television: "tv",
25
+ monitor: "tv",
26
+ sofa: "couch",
27
+ plant: "potted plant",
28
+ bike: "bicycle",
29
+ };
30
+ export function resolveCocoClassId(name) {
31
+ const key = name.trim().toLowerCase();
32
+ const canonical = ALIASES[key] ?? key;
33
+ const idx = COCO_CLASSES.indexOf(canonical);
34
+ return idx >= 0 ? idx : null;
35
+ }
36
+ //# sourceMappingURL=coco-classes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coco-classes.js","sourceRoot":"","sources":["../../src/find-object/coco-classes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO;IAC7E,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO;IAC9E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO;IAC1E,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS;IAC1E,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,gBAAgB;IAC5E,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK;IACzE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ;IACzE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAC3E,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO;IACxE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAC1E,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY;IAC/E,YAAY;CACJ,CAAC;AAEX,MAAM,OAAO,GAA2B;IACtC,KAAK,EAAE,YAAY;IACnB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,YAAY;IACxB,EAAE,EAAE,IAAI;IACR,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,SAA0C,CAAC,CAAC;IAC7E,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Rotate the robot in place until a target COCO class is detected in the
3
+ * camera feed, then stop. Used by the ros2_find_object MCP tool.
4
+ */
5
+ import type { AgenticROSConfig, RosTransport } from "@agenticros/core";
6
+ export interface FindObjectOptions {
7
+ target: string;
8
+ angularSpeed?: number;
9
+ timeoutSeconds?: number;
10
+ minConfidence?: number;
11
+ clockwise?: boolean;
12
+ }
13
+ export interface FindObjectResult {
14
+ found: boolean;
15
+ target: string;
16
+ classId: number;
17
+ elapsedSeconds: number;
18
+ rotationDirection: "clockwise" | "counterclockwise";
19
+ angularSpeed: number;
20
+ detection?: {
21
+ confidence: number;
22
+ cx: number;
23
+ cy: number;
24
+ width: number;
25
+ height: number;
26
+ imageWidth: number;
27
+ imageHeight: number;
28
+ horizontalOffset: number;
29
+ };
30
+ error?: string;
31
+ }
32
+ export declare function findObject(config: AgenticROSConfig, transport: RosTransport, opts: FindObjectOptions): Promise<FindObjectResult>;
33
+ //# sourceMappingURL=find-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-object.d.ts","sourceRoot":"","sources":["../../src/find-object/find-object.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgBvE,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,WAAW,GAAG,kBAAkB,CAAC;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,YAAY,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAgG3B"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Rotate the robot in place until a target COCO class is detected in the
3
+ * camera feed, then stop. Used by the ros2_find_object MCP tool.
4
+ */
5
+ import { resolveCameraSubscribeTopic, toNamespacedTopic } from "@agenticros/core";
6
+ import { ROS_MSG_COMPRESSED_IMAGE, cameraSnapshotFromPlainMessage, } from "@agenticros/ros-camera";
7
+ import { PersonDetector } from "../follow-me/detector.js";
8
+ import { resolveCocoClassId, COCO_CLASSES } from "./coco-classes.js";
9
+ const DEFAULT_COLOR_TOPIC = "/camera/camera/color/image_raw/compressed";
10
+ const DEFAULT_ANGULAR_SPEED = 0.3; // rad/s
11
+ const DEFAULT_TIMEOUT_SEC = 30;
12
+ const DEFAULT_MIN_CONFIDENCE = 0.5;
13
+ const POLL_INTERVAL_MS = 500;
14
+ const SNAPSHOT_TIMEOUT_MS = 3000;
15
+ export async function findObject(config, transport, opts) {
16
+ const classId = resolveCocoClassId(opts.target);
17
+ if (classId === null) {
18
+ return {
19
+ found: false,
20
+ target: opts.target,
21
+ classId: -1,
22
+ elapsedSeconds: 0,
23
+ rotationDirection: "clockwise",
24
+ angularSpeed: 0,
25
+ error: `Unknown target "${opts.target}". Must be a COCO class name (e.g., "cell phone", "chair", "bottle"). ` +
26
+ `Supported: ${COCO_CLASSES.join(", ")}.`,
27
+ };
28
+ }
29
+ const safety = config.safety ?? {};
30
+ const maxAngular = safety.maxAngularVelocity ?? 1.5;
31
+ const requestedSpeed = Math.max(0.05, Math.min(maxAngular, opts.angularSpeed ?? DEFAULT_ANGULAR_SPEED));
32
+ const clockwise = opts.clockwise ?? true;
33
+ const angularZ = clockwise ? -requestedSpeed : requestedSpeed;
34
+ const timeoutMs = Math.max(1000, (opts.timeoutSeconds ?? DEFAULT_TIMEOUT_SEC) * 1000);
35
+ const minConfidence = opts.minConfidence ?? DEFAULT_MIN_CONFIDENCE;
36
+ const detector = new PersonDetector({ scoreThreshold: minConfidence });
37
+ await detector.load();
38
+ const cmdVelTopic = resolveCmdVelTopic(config);
39
+ const colorTopic = resolveCameraSubscribeTopic(config, (config.robot?.cameraTopic ?? "").trim() || DEFAULT_COLOR_TOPIC);
40
+ const startedAt = Date.now();
41
+ let rotating = false;
42
+ let result;
43
+ const publishTwist = async (linearX, angZ) => {
44
+ try {
45
+ await transport.publish({
46
+ topic: cmdVelTopic,
47
+ type: "geometry_msgs/msg/Twist",
48
+ msg: { linear: { x: linearX, y: 0, z: 0 }, angular: { x: 0, y: 0, z: angZ } },
49
+ });
50
+ }
51
+ catch {
52
+ // best-effort; loop will retry
53
+ }
54
+ };
55
+ try {
56
+ await publishTwist(0, angularZ);
57
+ rotating = true;
58
+ const deadline = startedAt + timeoutMs;
59
+ while (Date.now() < deadline && !result) {
60
+ // Keep the rotation alive in case the robot times out cmd_vel commands.
61
+ await publishTwist(0, angularZ);
62
+ const frame = await snapshotOnce(transport, colorTopic).catch(() => null);
63
+ if (frame) {
64
+ const det = await detector.detectClass(frame.buffer, classId);
65
+ if (det.detections.length > 0) {
66
+ const best = det.detections.reduce((a, b) => (a.confidence > b.confidence ? a : b));
67
+ result = {
68
+ confidence: best.confidence,
69
+ cx: best.cx,
70
+ cy: best.cy,
71
+ width: best.width,
72
+ height: best.height,
73
+ imageWidth: det.width,
74
+ imageHeight: det.height,
75
+ horizontalOffset: (best.cx - det.width / 2) / (det.width / 2),
76
+ };
77
+ break;
78
+ }
79
+ }
80
+ const remaining = deadline - Date.now();
81
+ if (remaining <= 0)
82
+ break;
83
+ await sleep(Math.min(POLL_INTERVAL_MS, remaining));
84
+ }
85
+ }
86
+ finally {
87
+ if (rotating)
88
+ await publishTwist(0, 0);
89
+ await detector.dispose().catch(() => { });
90
+ }
91
+ const elapsedSeconds = (Date.now() - startedAt) / 1000;
92
+ return {
93
+ found: !!result,
94
+ target: opts.target,
95
+ classId,
96
+ elapsedSeconds,
97
+ rotationDirection: clockwise ? "clockwise" : "counterclockwise",
98
+ angularSpeed: requestedSpeed,
99
+ detection: result,
100
+ };
101
+ }
102
+ async function snapshotOnce(transport, topic) {
103
+ return new Promise((resolve) => {
104
+ const sub = transport.subscribe({ topic, type: ROS_MSG_COMPRESSED_IMAGE }, (msg) => {
105
+ clearTimeout(timer);
106
+ sub.unsubscribe();
107
+ try {
108
+ const payload = cameraSnapshotFromPlainMessage("CompressedImage", msg);
109
+ resolve({ buffer: Buffer.from(payload.dataBase64, "base64") });
110
+ }
111
+ catch {
112
+ resolve(null);
113
+ }
114
+ });
115
+ const timer = setTimeout(() => {
116
+ sub.unsubscribe();
117
+ resolve(null);
118
+ }, SNAPSHOT_TIMEOUT_MS);
119
+ });
120
+ }
121
+ function sleep(ms) {
122
+ return new Promise((resolve) => setTimeout(resolve, ms));
123
+ }
124
+ function resolveCmdVelTopic(config) {
125
+ const raw = (config.teleop?.cmdVelTopic ?? "").trim() || "/cmd_vel";
126
+ const namespaced = toNamespacedTopic(config, raw);
127
+ const match = namespaced.match(/^\/([^/]+)\/cmd_vel$/i);
128
+ const segment = match?.[1] ?? "";
129
+ if (match && !segment.toLowerCase().startsWith("robot")) {
130
+ return `/robot${segment.replace(/-/g, "")}/cmd_vel`;
131
+ }
132
+ return namespaced;
133
+ }
134
+ //# sourceMappingURL=find-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-object.js","sourceRoot":"","sources":["../../src/find-object/find-object.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EACL,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,mBAAmB,GAAG,2CAA2C,CAAC;AACxE,MAAM,qBAAqB,GAAG,GAAG,CAAC,CAAC,QAAQ;AAC3C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AA8BjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAwB,EACxB,SAAuB,EACvB,IAAuB;IAEvB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,CAAC,CAAC;YACX,cAAc,EAAE,CAAC;YACjB,iBAAiB,EAAE,WAAW;YAC9B,YAAY,EAAE,CAAC;YACf,KAAK,EACH,mBAAmB,IAAI,CAAC,MAAM,wEAAwE;gBACtG,cAAc,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SAC3C,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,kBAAkB,IAAI,GAAG,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC,CAAC;IACxG,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,sBAAsB,CAAC;IAEnE,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEtB,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,2BAA2B,CAC5C,MAAM,EACN,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,mBAAmB,CAChE,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,MAAiD,CAAC;IAEtD,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAY,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,OAAO,CAAC;gBACtB,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,yBAAyB;gBAC/B,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;aAC9E,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChC,QAAQ,GAAG,IAAI,CAAC;QAEhB,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACxC,wEAAwE;YACxE,MAAM,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEhC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC9D,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpF,MAAM,GAAG;wBACP,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,UAAU,EAAE,GAAG,CAAC,KAAK;wBACrB,WAAW,EAAE,GAAG,CAAC,MAAM;wBACvB,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;qBAC9D,CAAC;oBACF,MAAM;gBACR,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,SAAS,IAAI,CAAC;gBAAE,MAAM;YAC1B,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ;YAAE,MAAM,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;IACvD,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,MAAM;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO;QACP,cAAc;QACd,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB;QAC/D,YAAY,EAAE,cAAc;QAC5B,SAAS,EAAE,MAAM;KAClB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,SAAuB,EACvB,KAAa;IAEb,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,wBAAwB,EAAE,EACzC,CAAC,GAA4B,EAAE,EAAE;YAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,GAAG,CAAC,WAAW,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,8BAA8B,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;gBACvE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CACF,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,GAAG,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAwB;IAClD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC;IACpE,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,SAAS,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC;IACtD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Follower P-controller ported from agenticros_follow_me/follower_controller.py.
3
+ *
4
+ * Given a target person's 3D position (x = lateral metres, z = depth metres),
5
+ * compute a smoothed, deadzoned, clamped Twist command.
6
+ */
7
+ export interface ControllerConfig {
8
+ targetDistance: number;
9
+ maxLinearVel: number;
10
+ maxAngularVel: number;
11
+ kpDistance: number;
12
+ kpAngular: number;
13
+ distanceDeadzone: number;
14
+ angularDeadzone: number;
15
+ smoothingFactor: number;
16
+ watchdogTimeoutMs: number;
17
+ }
18
+ export declare const DEFAULT_CONTROLLER_CONFIG: ControllerConfig;
19
+ export interface Twist {
20
+ linearX: number;
21
+ angularZ: number;
22
+ }
23
+ export interface TargetSample {
24
+ /** Lateral offset in metres (positive = right of camera centre). */
25
+ x: number;
26
+ /** Forward depth in metres. */
27
+ z: number;
28
+ confidence: number;
29
+ }
30
+ export declare class FollowerController {
31
+ readonly config: ControllerConfig;
32
+ private smoothedLinear;
33
+ private smoothedAngular;
34
+ private lastDetectionMs;
35
+ private lastTwist;
36
+ constructor(config?: Partial<ControllerConfig>);
37
+ setTargetDistance(d: number): void;
38
+ reset(): void;
39
+ /** Compute next twist. Pass null when no person is detected this tick. */
40
+ update(target: TargetSample | null): Twist;
41
+ getLastTwist(): Twist;
42
+ }
43
+ //# sourceMappingURL=controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/follow-me/controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,yBAAyB,EAAE,gBAUvC,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,SAAS,CAAsC;gBAE3C,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAIlD,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAOb,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,GAAG,KAAK;IAkC1C,YAAY,IAAI,KAAK;CAGtB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Follower P-controller ported from agenticros_follow_me/follower_controller.py.
3
+ *
4
+ * Given a target person's 3D position (x = lateral metres, z = depth metres),
5
+ * compute a smoothed, deadzoned, clamped Twist command.
6
+ */
7
+ export const DEFAULT_CONTROLLER_CONFIG = {
8
+ targetDistance: 1.0,
9
+ maxLinearVel: 0.5,
10
+ maxAngularVel: 1.0,
11
+ kpDistance: 0.5,
12
+ kpAngular: 1.5,
13
+ distanceDeadzone: 0.05,
14
+ angularDeadzone: 0.05,
15
+ smoothingFactor: 0.3,
16
+ watchdogTimeoutMs: 500,
17
+ };
18
+ export class FollowerController {
19
+ config;
20
+ smoothedLinear = 0;
21
+ smoothedAngular = 0;
22
+ lastDetectionMs = 0;
23
+ lastTwist = { linearX: 0, angularZ: 0 };
24
+ constructor(config = {}) {
25
+ this.config = { ...DEFAULT_CONTROLLER_CONFIG, ...config };
26
+ }
27
+ setTargetDistance(d) {
28
+ this.config.targetDistance = Math.max(0.3, Math.min(5.0, d));
29
+ }
30
+ reset() {
31
+ this.smoothedLinear = 0;
32
+ this.smoothedAngular = 0;
33
+ this.lastTwist = { linearX: 0, angularZ: 0 };
34
+ this.lastDetectionMs = Date.now();
35
+ }
36
+ /** Compute next twist. Pass null when no person is detected this tick. */
37
+ update(target) {
38
+ const now = Date.now();
39
+ if (!target) {
40
+ if (now - this.lastDetectionMs > this.config.watchdogTimeoutMs) {
41
+ this.smoothedLinear = 0;
42
+ this.smoothedAngular = 0;
43
+ this.lastTwist = { linearX: 0, angularZ: 0 };
44
+ return this.lastTwist;
45
+ }
46
+ return this.lastTwist;
47
+ }
48
+ this.lastDetectionMs = now;
49
+ let distErr = target.z - this.config.targetDistance;
50
+ // angular error: pointing right (positive x) should turn right (negative angular_z)
51
+ let angErr = -Math.atan2(target.x, Math.max(target.z, 0.1));
52
+ if (Math.abs(distErr) < this.config.distanceDeadzone)
53
+ distErr = 0;
54
+ if (Math.abs(angErr) < this.config.angularDeadzone)
55
+ angErr = 0;
56
+ let linearCmd = this.config.kpDistance * distErr;
57
+ let angularCmd = this.config.kpAngular * angErr;
58
+ linearCmd = clamp(linearCmd, -this.config.maxLinearVel, this.config.maxLinearVel);
59
+ angularCmd = clamp(angularCmd, -this.config.maxAngularVel, this.config.maxAngularVel);
60
+ const a = this.config.smoothingFactor;
61
+ this.smoothedLinear = a * linearCmd + (1 - a) * this.smoothedLinear;
62
+ this.smoothedAngular = a * angularCmd + (1 - a) * this.smoothedAngular;
63
+ this.lastTwist = { linearX: this.smoothedLinear, angularZ: this.smoothedAngular };
64
+ return this.lastTwist;
65
+ }
66
+ getLastTwist() {
67
+ return this.lastTwist;
68
+ }
69
+ }
70
+ function clamp(v, lo, hi) {
71
+ return Math.max(lo, Math.min(hi, v));
72
+ }
73
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/follow-me/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * YOLOv8n person detector for the MCP-side follow-me loop.
3
+ *
4
+ * Loads a YOLOv8n ONNX model and runs person-only detection on a single JPEG/PNG
5
+ * frame. Image decoded with sharp; inference via onnxruntime-node (CPU).
6
+ *
7
+ * Model lookup order:
8
+ * 1. AGENTICROS_YOLOV8_MODEL env var (absolute path)
9
+ * 2. ~/.agenticros/models/yolov8n.onnx
10
+ * If the file is missing it is downloaded from AGENTICROS_YOLOV8_URL (or a default
11
+ * public mirror). 6 MB, one-time.
12
+ */
13
+ export interface PersonDetection {
14
+ /** Bounding box in original image pixel coordinates. */
15
+ x: number;
16
+ y: number;
17
+ width: number;
18
+ height: number;
19
+ /** Center of the bbox (image pixels). */
20
+ cx: number;
21
+ cy: number;
22
+ /** Detection confidence [0,1]. */
23
+ confidence: number;
24
+ }
25
+ export interface DetectorOptions {
26
+ /** Score threshold for filtering raw detections (default 0.4). */
27
+ scoreThreshold?: number;
28
+ /** IoU threshold for NMS (default 0.5). */
29
+ iouThreshold?: number;
30
+ }
31
+ export declare class PersonDetector {
32
+ private session;
33
+ private readonly scoreThreshold;
34
+ private readonly iouThreshold;
35
+ constructor(opts?: DetectorOptions);
36
+ load(): Promise<void>;
37
+ /**
38
+ * Detect people in a JPEG/PNG image buffer.
39
+ *
40
+ * Returns bounding boxes in the original image's pixel space.
41
+ */
42
+ detect(image: Buffer | Uint8Array): Promise<{
43
+ width: number;
44
+ height: number;
45
+ persons: PersonDetection[];
46
+ }>;
47
+ /**
48
+ * Detect a single COCO class (0..79) in a JPEG/PNG image buffer.
49
+ * 0=person, 67=cell phone, 56=chair, ... see find-object/coco-classes.ts.
50
+ */
51
+ detectClass(image: Buffer | Uint8Array, classId: number): Promise<{
52
+ width: number;
53
+ height: number;
54
+ detections: PersonDetection[];
55
+ }>;
56
+ dispose(): Promise<void>;
57
+ }
58
+ //# sourceMappingURL=detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/follow-me/detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkDH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6FD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,IAAI,GAAE,eAAoB;IAKhC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAKhH;;;OAGG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,GAAG,UAAU,EAC1B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAuFtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAM/B"}