diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 85540dee..81ef2e47 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -243,13 +243,6 @@ export GZ_SIM_SYSTEM_PLUGIN_PATH=\$HOME/ardupilot_gazebo/build:\$GZ_SIM_SYSTEM_P # Add ardupilot_gazebo models and worlds export GZ_SIM_RESOURCE_PATH=\$HOME/ardupilot_gazebo/models:\$HOME/ardupilot_gazebo/worlds:\$GZ_SIM_RESOURCE_PATH - -# Add blue models and worlds -BLUE_DESCRIPTION=\$USER_WORKSPACE/src/blue/blue_description -export GZ_SIM_RESOURCE_PATH=\$BLUE_DESCRIPTION/gazebo/models:\$BLUE_DESCRIPTION/gazebo/worlds:\$GZ_SIM_RESOURCE_PATH - -# Add blue meshes -export GZ_SIM_RESOURCE_PATH=\$BLUE_DESCRIPTION/meshes:\$GZ_SIM_RESOURCE_PATH EOT FROM desktop AS desktop-nvidia diff --git a/.docker/compose/nouveau-desktop.yaml b/.docker/compose/nouveau-desktop.yaml index f18588de..d7ccecac 100644 --- a/.docker/compose/nouveau-desktop.yaml +++ b/.docker/compose/nouveau-desktop.yaml @@ -1,4 +1,3 @@ -version: "3" services: blue: image: ghcr.io/robotic-decision-making-lab/blue:rolling-desktop diff --git a/.docker/compose/nvidia-desktop.yaml b/.docker/compose/nvidia-desktop.yaml index da240d51..86526f43 100644 --- a/.docker/compose/nvidia-desktop.yaml +++ b/.docker/compose/nvidia-desktop.yaml @@ -1,4 +1,3 @@ -version: "3" services: blue: image: ghcr.io/robotic-decision-making-lab/blue:rolling-desktop-nvidia diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 22ba1977..bd903c86 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -99,7 +99,7 @@ jobs: - if: github.event_name == 'push' name: Build and push (non PR) - uses: docker/bake-action@v5.7.0 + uses: docker/bake-action@v5.10.0 env: BLUE_ROS_DISTRO: ${{ matrix.ROS_DISTRO }} BLUE_GITHUB_REPO: ${{ steps.lowercase-repo.outputs.repository }} @@ -119,7 +119,7 @@ jobs: # Pull request builds are not cached; and only built for AMD64 - if: github.event_name == 'pull_request' name: Build and push (PR) - uses: docker/bake-action@v5.7.0 + uses: docker/bake-action@v5.10.0 env: BLUE_ROS_DISTRO: ${{ matrix.ROS_DISTRO }} BLUE_GITHUB_REPO: ${{ steps.lowercase-repo.outputs.repository }} diff --git a/blue_bringup/launch/bluerov2/bluerov2.launch.yaml b/blue_bringup/launch/bluerov2/bluerov2.launch.yaml index b57e0937..7781fd27 100644 --- a/blue_bringup/launch/bluerov2/bluerov2.launch.yaml +++ b/blue_bringup/launch/bluerov2/bluerov2.launch.yaml @@ -39,7 +39,7 @@ launch: - arg: name: gazebo_world_file - default: $(find-pkg-share blue_description)/gazebo/worlds/$(var model_name)_underwater.world + default: $(find-pkg-share blue_description)/gazebo/worlds/underwater.world - arg: name: mavros_file @@ -122,4 +122,4 @@ launch: file: $(find-pkg-share blue_bringup)/launch/$(var model_name)/thrusters.launch.yaml - include: - file: $(find-pkg-share mobile_to_maritime)/launch/tf.launch.yaml + file: $(find-pkg-share message_transforms)/launch/tf.launch.yaml diff --git a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml b/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml index 93897099..8d8f8de7 100644 --- a/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml +++ b/blue_bringup/launch/bluerov2_heavy/bluerov2_heavy.launch.yaml @@ -39,7 +39,7 @@ launch: - arg: name: gazebo_world_file - default: $(find-pkg-share blue_description)/gazebo/worlds/$(var model_name)_underwater.world + default: $(find-pkg-share blue_description)/gazebo/worlds/underwater.world - arg: name: mavros_file @@ -122,4 +122,4 @@ launch: file: $(find-pkg-share blue_bringup)/launch/$(var model_name)/thrusters.launch.yaml - include: - file: $(find-pkg-share mobile_to_maritime)/launch/tf.launch.yaml + file: $(find-pkg-share message_transforms)/launch/tf.launch.yaml diff --git a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml b/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml index d16e459b..1464a0a8 100644 --- a/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml +++ b/blue_bringup/launch/bluerov2_heavy_reach/bluerov2_heavy_reach.launch.yaml @@ -39,7 +39,7 @@ launch: - arg: name: gazebo_world_file - default: $(find-pkg-share blue_description)/gazebo/worlds/$(var model_name)_underwater.world + default: $(find-pkg-share blue_description)/gazebo/worlds/underwater.world - arg: name: mavros_file @@ -122,4 +122,4 @@ launch: file: $(find-pkg-share blue_bringup)/launch/$(var model_name)/thrusters.launch.yaml - include: - file: $(find-pkg-share mobile_to_maritime)/launch/tf.launch.yaml + file: $(find-pkg-share message_transforms)/launch/tf.launch.yaml diff --git a/blue_demos/control_integration/config/transforms.yaml b/blue_demos/control_integration/config/transforms.yaml new file mode 100644 index 00000000..6f562a34 --- /dev/null +++ b/blue_demos/control_integration/config/transforms.yaml @@ -0,0 +1,11 @@ +/control_integration/message_transforms: + ros__parameters: + + incoming_topics: + - /mavros/local_position/velocity_body + + transforms: + /mavros/local_position/velocity_body: + outgoing_topic: /integral_sliding_mode_controller/system_state + message_type: geometry_msgs/msg/TwistStamped + frame_id: base_link_fsd diff --git a/blue_demos/control_integration/launch/bluerov2_controllers.launch.py b/blue_demos/control_integration/launch/bluerov2_controllers.launch.py index b4e6d059..e37dc412 100644 --- a/blue_demos/control_integration/launch/bluerov2_controllers.launch.py +++ b/blue_demos/control_integration/launch/bluerov2_controllers.launch.py @@ -19,9 +19,14 @@ # THE SOFTWARE. from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, RegisterEventHandler +from launch.actions import ( + DeclareLaunchArgument, + IncludeLaunchDescription, + RegisterEventHandler, +) from launch.event_handlers import OnProcessExit -from launch.substitutions import PathJoinSubstitution +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import PathJoinSubstitution, TextSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -48,18 +53,27 @@ def generate_launch_description() -> LaunchDescription: ] # The ISMC expects state information to be provided in the FSD frame - mobile_to_maritime_velocity_state = Node( - package="mobile_to_maritime", - executable="mobile_twist_stamped_to_maritime_twist", - name="velocity_state_transform", - parameters=[ - { - "in_topic": "/mavros/local_position/velocity_body", - "out_topic": "/integral_sliding_mode_controller/system_state", - "qos_reliability": "best_effort", - "qos_durability": "volatile", - } - ], + message_transformer = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + PathJoinSubstitution( + [ + FindPackageShare("message_transforms"), + "launch", + "message_transforms.launch.py", + ] + ) + ), + launch_arguments={ + "parameters_file": PathJoinSubstitution( + [ + FindPackageShare("blue_demos"), + "control_integration", + "config", + "transforms.yaml", + ] + ), + "ns": TextSubstitution(text="control_integration"), + }.items(), ) controller_manager = Node( @@ -151,7 +165,7 @@ def generate_launch_description() -> LaunchDescription: return LaunchDescription( [ *args, - mobile_to_maritime_velocity_state, + message_transformer, controller_manager, *delay_thruster_spawners, delay_tam_controller_spawner_after_thruster_controller_spawners, diff --git a/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py b/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py index 5e367672..3f6ab9a9 100644 --- a/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py +++ b/blue_demos/control_integration/launch/bluerov2_heavy_controllers.launch.py @@ -19,9 +19,14 @@ # THE SOFTWARE. from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, RegisterEventHandler +from launch.actions import ( + DeclareLaunchArgument, + IncludeLaunchDescription, + RegisterEventHandler, +) from launch.event_handlers import OnProcessExit -from launch.substitutions import PathJoinSubstitution +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import PathJoinSubstitution, TextSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -47,18 +52,27 @@ def generate_launch_description() -> LaunchDescription: ] # The ISMC expects state information to be provided in the FSD frame - mobile_to_maritime_velocity_state = Node( - package="mobile_to_maritime", - executable="mobile_twist_stamped_to_maritime_twist", - name="velocity_state_transform", - parameters=[ - { - "in_topic": "/mavros/local_position/velocity_body", - "out_topic": "/integral_sliding_mode_controller/system_state", - "qos_reliability": "best_effort", - "qos_durability": "volatile", - } - ], + message_transformer = IncludeLaunchDescription( + PythonLaunchDescriptionSource( + PathJoinSubstitution( + [ + FindPackageShare("message_transforms"), + "launch", + "message_transforms.launch.py", + ] + ) + ), + launch_arguments={ + "parameters_file": PathJoinSubstitution( + [ + FindPackageShare("blue_demos"), + "control_integration", + "config", + "transforms.yaml", + ] + ), + "ns": TextSubstitution(text="control_integration"), + }.items(), ) controller_manager = Node( @@ -150,7 +164,7 @@ def generate_launch_description() -> LaunchDescription: return LaunchDescription( [ *args, - mobile_to_maritime_velocity_state, + message_transformer, controller_manager, *delay_thruster_spawners, delay_tam_controller_spawner_after_thruster_controller_spawners, diff --git a/blue_demos/teleoperation/config/joy_teleop.yaml b/blue_demos/teleoperation/config/joy_teleop.yaml index c1d3dd7a..aa19c8b6 100644 --- a/blue_demos/teleoperation/config/joy_teleop.yaml +++ b/blue_demos/teleoperation/config/joy_teleop.yaml @@ -8,7 +8,7 @@ joy_teleop: manual_control: type: topic interface_type: geometry_msgs/msg/Twist - topic_name: cmd_vel + topic_name: /cmd_vel deadman_axes: [2] axis_mappings: linear-x: diff --git a/blue_demos/teleoperation/config/transforms.yaml b/blue_demos/teleoperation/config/transforms.yaml new file mode 100644 index 00000000..00c04540 --- /dev/null +++ b/blue_demos/teleoperation/config/transforms.yaml @@ -0,0 +1,10 @@ +message_transforms: + ros__parameters: + + incoming_topics: + - /cmd_vel + + transforms: + /cmd_vel: + outgoing_topic: /integral_sliding_mode_controller/reference + message_type: geometry_msgs/msg/Twist diff --git a/blue_demos/teleoperation/launch/joy_teleop.launch.yaml b/blue_demos/teleoperation/launch/joy_teleop.launch.yaml index 34598461..966f3620 100644 --- a/blue_demos/teleoperation/launch/joy_teleop.launch.yaml +++ b/blue_demos/teleoperation/launch/joy_teleop.launch.yaml @@ -5,8 +5,8 @@ launch: default: $(find-pkg-share blue_demos)/teleoperation/config/joy_teleop.yaml - arg: - name: use_maritime - default: "true" + name: transforms_file + default: $(find-pkg-share blue_demos)/teleoperation/config/transforms.yaml - node: pkg: joy_linux @@ -22,12 +22,8 @@ launch: param: - from: $(var joy_file) - - node: - pkg: mobile_to_maritime - exec: mobile_twist_to_maritime_twist - param: - - name: in_topic - value: cmd_vel - - name: out_topic - value: /integral_sliding_mode_controller/reference - if: $(var use_maritime) + - include: + file: $(find-pkg-share message_transforms)/launch/message_transforms.launch.py + arg: + - name: parameters_file + value: $(var transforms_file) diff --git a/blue_description/CMakeLists.txt b/blue_description/CMakeLists.txt index de084cee..cc68f270 100644 --- a/blue_description/CMakeLists.txt +++ b/blue_description/CMakeLists.txt @@ -8,4 +8,6 @@ install( DESTINATION share/blue_description ) +ament_environment_hooks("${CMAKE_CURRENT_SOURCE_DIR}/hooks/hooks.dsv.in") + ament_package() diff --git a/blue_description/gazebo/worlds/bluerov2_heavy_underwater.world b/blue_description/gazebo/worlds/bluerov2_heavy_underwater.world deleted file mode 100644 index 715d1171..00000000 --- a/blue_description/gazebo/worlds/bluerov2_heavy_underwater.world +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - 1000 - - 0 - 1 - - - bluerov2_heavy - - - - https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun - - - - model://sand_heightmap - 0 7 -10 0 0 0 - - - - diff --git a/blue_description/gazebo/worlds/bluerov2_underwater.world b/blue_description/gazebo/worlds/bluerov2_underwater.world deleted file mode 100644 index c1d7ce12..00000000 --- a/blue_description/gazebo/worlds/bluerov2_underwater.world +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - 1000 - - 0 - 1 - - - bluerov2 - - - - https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun - - - - model://sand_heightmap - 0 7 -10 0 0 0 - - - - diff --git a/blue_description/gazebo/worlds/bluerov2_heavy_reach_underwater.world b/blue_description/gazebo/worlds/underwater.world similarity index 65% rename from blue_description/gazebo/worlds/bluerov2_heavy_reach_underwater.world rename to blue_description/gazebo/worlds/underwater.world index 4d908b1e..22e75d54 100644 --- a/blue_description/gazebo/worlds/bluerov2_heavy_reach_underwater.world +++ b/blue_description/gazebo/worlds/underwater.world @@ -1,6 +1,6 @@ - + 1 - bluerov2_heavy_reach @@ -43,5 +42,26 @@ 0 7 -10 0 0 0 + + + https://fuel.gazebosim.org/1.0/OpenRobotics/models/Coast Water + + 0 0 0 0 0 0 + + + + 1.0 1.0 1.0 + 0.8 0.8 0.8 + + + + + 50 0 150 0 0 0 + 1 1 1 1 + .1 .1 .1 1 + 0.3 0.3 -1 + false + + diff --git a/blue_description/hooks/hooks.dsv.in b/blue_description/hooks/hooks.dsv.in new file mode 100644 index 00000000..9e0cfbd7 --- /dev/null +++ b/blue_description/hooks/hooks.dsv.in @@ -0,0 +1,2 @@ +prepend-non-duplicate;GZ_SIM_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/@PROJECT_NAME@/gazebo/models +prepend-non-duplicate;GZ_SIM_RESOURCE_PATH;@CMAKE_INSTALL_PREFIX@/share/@PROJECT_NAME@/gazebo/worlds diff --git a/docs/docs/tutorials/teleop.mdx b/docs/docs/tutorials/teleop.mdx index f2e1796a..6e468a91 100644 --- a/docs/docs/tutorials/teleop.mdx +++ b/docs/docs/tutorials/teleop.mdx @@ -51,10 +51,17 @@ Docker as described in the [installation instructions](/installation). [REP-105](https://ros.org/reps/rep-0105.html); however, the launched ISMC adheres to the maritime conventions recorded in [REP-156](https://github.com/ros-infrastructure/rep/pull/398). To convert the velocity commands to the appropriate convention, run the - following `mobile_to_maritime` message filter in a new terminal: + `message_transforms` node in a new terminal: ```bash - ros2 run mobile_to_maritime mobile_twist_to_maritime_twist --ros-args -p in_topic:=/cmd_vel -p out_topic:=/integral_sliding_mode_controller/reference + ros2 launch message_transforms message_transforms.launch.py parameters_file:= + ``` + + where `` should be replaced with the path to the + `transforms.yaml` file in the `blue_demos` package, e.g., + + ```bash + ros2 launch message_transforms message_transforms.launch.py parameters_file:=./blue_demos/teleoperation/config/transforms.yaml ``` 5. You should now be able to teleoperate the BlueROV2 using your keyboard. diff --git a/docs/package-lock.json b/docs/package-lock.json index 9a29d9d2..f1241005 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -5127,10 +5127,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "license": "MIT", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5140,7 +5139,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5154,7 +5153,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5163,7 +5161,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5172,7 +5169,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5183,8 +5179,7 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { "version": "1.2.1", @@ -5867,7 +5862,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5879,10 +5873,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -7138,7 +7131,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7156,7 +7148,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7409,8 +7400,7 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.5.6", @@ -7456,10 +7446,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -8395,7 +8384,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8451,37 +8439,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "license": "MIT", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -8520,10 +8507,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", @@ -8723,13 +8709,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -8744,7 +8729,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8752,8 +8736,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "4.0.0", @@ -8990,7 +8973,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9938,7 +9920,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -9971,10 +9952,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "license": "MIT", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -11775,7 +11755,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11793,10 +11772,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -11814,10 +11795,9 @@ } }, "node_modules/mermaid": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.1.tgz", - "integrity": "sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA==", - "license": "MIT", + "version": "10.9.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.9.3.tgz", + "integrity": "sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==", "dependencies": { "@braintree/sanitize-url": "^6.0.1", "@types/d3-scale": "^4.0.3", @@ -11828,7 +11808,7 @@ "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.10", "dayjs": "^1.11.7", - "dompurify": "^3.0.5", + "dompurify": "^3.0.5 <3.1.7", "elkjs": "^0.9.0", "katex": "^0.16.9", "khroma": "^2.0.0", @@ -14081,7 +14061,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -14504,7 +14483,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -15822,12 +15800,11 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15899,7 +15876,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15914,7 +15890,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15923,7 +15898,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -17048,10 +17022,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -17075,7 +17048,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -17083,20 +17055,25 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -17211,15 +17188,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "license": "MIT", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -17261,8 +17237,7 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shallow-clone": { "version": "3.0.1", @@ -17557,7 +17532,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18073,7 +18047,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } @@ -18178,7 +18151,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -18191,7 +18163,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -18200,7 +18171,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -18521,7 +18491,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" }