Repository: kestra-io/kestra
Pull request #7137 (2025-02-03 05:43:14)

build(deps): bump org.owasp.dependencycheck from 12.0.1 to 12.0.2
Bumps org.owasp.dependencycheck from 12.0.1 to 12.0.2.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.owasp.dependencycheck&package-manager=gradle&previous-version=12.0.1&new-version=12.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/build.gradle b/build.gradle
index 9b51c76f9..c95a955bb 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,7 +16,7 @@ plugins {
     id "java"
     id 'java-library'
     id "idea"
-    id "com.gradleup.shadow" version "8.3.5"
+    id "com.gradleup.shadow" version "8.3.6"
     id "application"
 
     // test
@@ -39,7 +39,7 @@ plugins {
     id 'ru.vyarus.github-info' version '2.0.0' apply false
 
     // OWASP dependency check
-    id "org.owasp.dependencycheck" version "12.0.1" apply false
+    id "org.owasp.dependencycheck" version "12.0.2" apply false
 }
 
 idea {
diff --git a/cli/src/main/java/io/kestra/cli/App.java b/cli/src/main/java/io/kestra/cli/App.java
index f16e01a4d..4e309c618 100644
--- a/cli/src/main/java/io/kestra/cli/App.java
+++ b/cli/src/main/java/io/kestra/cli/App.java
@@ -88,11 +88,12 @@ public class App implements Callable<Integer> {
             .environments(Environment.CLI);
 
         CommandLine cmd = new CommandLine(mainClass, CommandLine.defaultFactory());
+        continueOnParsingErrors(cmd);
 
         CommandLine.ParseResult parseResult = cmd.parseArgs(args);
         List<CommandLine> parsedCommands = parseResult.asCommandLineList();
 
-        CommandLine commandLine = parsedCommands.get(parsedCommands.size() - 1);
+        CommandLine commandLine = parsedCommands.getLast();
         Class<?> cls = commandLine.getCommandSpec().userObject().getClass();
 
         if (AbstractCommand.class.isAssignableFrom(cls)) {
@@ -114,15 +115,17 @@ public class App implements Callable<Integer> {
                 .stream()
                 .filter(argSpec -> ((Field) argSpec.userObject()).getName().equals("serverPort"))
                 .findFirst()
-                .ifPresent(argSpec -> {
-                    properties.put("micronaut.server.port", argSpec.getValue());
-                });
+                .ifPresent(argSpec -> properties.put("micronaut.server.port", argSpec.getValue()));
 
             builder.properties(properties);
         }
         return builder.build();
     }
 
+    private static void continueOnParsingErrors(CommandLine cmd) {
+        cmd.getCommandSpec().parser().collectErrors(true);
+    }
+
     @SuppressWarnings("unchecked")
     private static <T> T getPropertiesFromMethod(Class<?> cls, String methodName, Object instance) {
         try {
diff --git a/cli/src/main/java/io/kestra/cli/commands/plugins/PluginDocCommand.java b/cli/src/main/java/io/kestra/cli/commands/plugins/PluginDocCommand.java
index 52c53a0ca..043659085 100644
--- a/cli/src/main/java/io/kestra/cli/commands/plugins/PluginDocCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/plugins/PluginDocCommand.java
@@ -1,6 +1,5 @@
 package io.kestra.cli.commands.plugins;
 
-import com.google.common.base.Charsets;
 import com.google.common.io.Files;
 import io.kestra.cli.AbstractCommand;
 import io.kestra.core.docs.DocumentationGenerator;
@@ -61,7 +60,7 @@ public class PluginDocCommand extends AbstractCommand {
                                 Files
                                     .asCharSink(
                                         file,
-                                        Charsets.UTF_8
+                                        StandardCharsets.UTF_8
                                     ).write(s.getBody());
                                 stdOut("Generate doc in: {0}", file);
 
diff --git a/core/src/main/java/io/kestra/core/docs/DocumentationGenerator.java b/core/src/main/java/io/kestra/core/docs/DocumentationGenerator.java
index eab36c131..7946fc6f2 100644
--- a/core/src/main/java/io/kestra/core/docs/DocumentationGenerator.java
+++ b/core/src/main/java/io/kestra/core/docs/DocumentationGenerator.java
@@ -1,6 +1,5 @@
 package io.kestra.core.docs;
 
-import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableMap;
 import io.kestra.core.models.annotations.PluginSubGroup;
 import io.kestra.core.models.conditions.Condition;
@@ -29,6 +28,7 @@ import org.apache.commons.io.IOUtils;
 
 import java.io.IOException;
 import java.io.Writer;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -257,7 +257,7 @@ public class DocumentationGenerator {
     public static <T> String render(String templateName, Map<String, Object> vars) throws IOException {
         String pebbleTemplate = IOUtils.toString(
             Objects.requireNonNull(DocumentationGenerator.class.getClassLoader().getResourceAsStream("docs/" + templateName + ".peb")),
-            Charsets.UTF_8
+            StandardCharsets.UTF_8
         );
 
         PebbleTemplate compiledTemplate = pebbleEngine.getLiteralTemplate(pebbleTemplate);
diff --git a/core/src/main/java/io/kestra/core/docs/JsonSchemaGenerator.java b/core/src/main/java/io/kestra/core/docs/JsonSchemaGenerator.java
index f40278ca9..76a5398c7 100644
--- a/core/src/main/java/io/kestra/core/docs/JsonSchemaGenerator.java
+++ b/core/src/main/java/io/kestra/core/docs/JsonSchemaGenerator.java
@@ -311,10 +311,12 @@ public class JsonSchemaGenerator {
             if (member.getDeclaredType().isInstanceOf(Property.class)) {
                 memberAttributes.put("$dynamic", true);
                 // if we are in the String definition of a Property but the target type is not String: we configure the pattern
-                Class<?> targetType = member.getDeclaredType().getTypeParameters().getFirst().getErasedType();
-                if (!String.class.isAssignableFrom(targetType) && String.class.isAssignableFrom(member.getType().getErasedType())) {
-                    memberAttributes.put("pattern", ".*{{.*}}.*");
-                }
+                // TODO this was a good idea but their is too much cases where it didn't work like in List or Map so if we want it we need to make it more clever
+                //  I keep it for now commented but at some point we may want to re-do and improve it or remove these commented lines
+//                Class<?> targetType = member.getDeclaredType().getTypeParameters().getFirst().getErasedType();
+//                if (!String.class.isAssignableFrom(targetType) && String.class.isAssignableFrom(member.getType().getErasedType())) {
+//                    memberAttributes.put("pattern", ".*{{.*}}.*");
+//                }
             } else if (member.getDeclaredType().isInstanceOf(Data.class)) {
                 memberAttributes.put("$dynamic", false);
             }
diff --git a/core/src/main/java/io/kestra/core/models/validations/KestraConstraintViolationException.java b/core/src/main/java/io/kestra/core/models/validations/KestraConstraintViolationException.java
index 8e03e2d36..180c0ba83 100644
--- a/core/src/main/java/io/kestra/core/models/validations/KestraConstraintViolationException.java
+++ b/core/src/main/java/io/kestra/core/models/validations/KestraConstraintViolationException.java
@@ -5,11 +5,14 @@ import io.kestra.core.models.tasks.Task;
 import jakarta.validation.ConstraintViolation;
 import jakarta.validation.ConstraintViolationException;
 
+import java.io.Serial;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class KestraConstraintViolationException extends ConstraintViolationException {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
     public KestraConstraintViolationException(Set<? extends ConstraintViolation<?>> constraintViolations) {
         super(constraintViolations);
diff --git a/core/src/main/java/io/kestra/core/runners/pebble/filters/UrlDecoderFilter.java b/core/src/main/java/io/kestra/core/runners/pebble/filters/UrlDecoderFilter.java
index ca28f8b79..8bc115386 100644
--- a/core/src/main/java/io/kestra/core/runners/pebble/filters/UrlDecoderFilter.java
+++ b/core/src/main/java/io/kestra/core/runners/pebble/filters/UrlDecoderFilter.java
@@ -12,8 +12,8 @@ import io.pebbletemplates.pebble.extension.Filter;
 import io.pebbletemplates.pebble.template.EvaluationContext;
 import io.pebbletemplates.pebble.template.PebbleTemplate;
 
-import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
 
@@ -31,10 +31,7 @@ public class UrlDecoderFilter implements Filter {
             return null;
         }
         String arg = (String) input;
-        try {
-            arg = URLDecoder.decode(arg, "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-        }
+        arg = URLDecoder.decode(arg, StandardCharsets.UTF_8);
         return arg;
     }
 
diff --git a/core/src/main/java/io/kestra/core/utils/Hashing.java b/core/src/main/java/io/kestra/core/utils/Hashing.java
index c0164403a..d6f8dc960 100644
--- a/core/src/main/java/io/kestra/core/utils/Hashing.java
+++ b/core/src/main/java/io/kestra/core/utils/Hashing.java
@@ -1,8 +1,7 @@
 package io.kestra.core.utils;
 
-import com.google.common.base.Charsets;
 import com.google.common.hash.HashCode;
-import com.google.common.hash.Hasher;
+import java.nio.charset.StandardCharsets;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
@@ -62,6 +61,6 @@ public final class Hashing {
     }
 
     private static HashCode getHashString(String value) {
-        return com.google.common.hash.Hashing.murmur3_128().hashString(value, Charsets.UTF_8);
+        return com.google.common.hash.Hashing.murmur3_128().hashString(value, StandardCharsets.UTF_8);
     }
 }
diff --git a/core/src/main/java/io/kestra/core/utils/IdUtils.java b/core/src/main/java/io/kestra/core/utils/IdUtils.java
index dde5d7b43..d6f9ed990 100644
--- a/core/src/main/java/io/kestra/core/utils/IdUtils.java
+++ b/core/src/main/java/io/kestra/core/utils/IdUtils.java
@@ -1,9 +1,9 @@
 package io.kestra.core.utils;
 
 import com.devskiller.friendly_id.FriendlyId;
-import com.google.common.base.Charsets;
 import com.google.common.hash.HashFunction;
 import com.google.common.hash.Hashing;
+import java.nio.charset.StandardCharsets;
 
 import java.util.Arrays;
 import java.util.UUID;
@@ -21,7 +21,7 @@ abstract public class IdUtils {
     public static String from(String from) {
         return FriendlyId.toFriendlyId(
             UUID.nameUUIDFromBytes(
-                HASH_FUNCTION.hashString(from, Charsets.UTF_8).asBytes()
+                HASH_FUNCTION.hashString(from, StandardCharsets.UTF_8).asBytes()
             )
         );
     }
diff --git a/core/src/main/java/io/kestra/plugin/core/debug/Return.java b/core/src/main/java/io/kestra/plugin/core/debug/Return.java
index 9a7185ee5..a692f7061 100644
--- a/core/src/main/java/io/kestra/plugin/core/debug/Return.java
+++ b/core/src/main/java/io/kestra/plugin/core/debug/Return.java
@@ -25,7 +25,7 @@ import java.util.Optional;
 @Schema(
     title = "Return a value for debugging purposes.",
     description = """
-        This task is intended for troubleshooting. 
+        This task is intended for troubleshooting.
 
         It allows you to return templated values, inputs or outputs."""
 )
diff --git a/core/src/main/java/io/kestra/plugin/core/flow/ForEach.java b/core/src/main/java/io/kestra/plugin/core/flow/ForEach.java
index ba29d8978..cf0991072 100644
--- a/core/src/main/java/io/kestra/plugin/core/flow/ForEach.java
+++ b/core/src/main/java/io/kestra/plugin/core/flow/ForEach.java
@@ -190,10 +190,10 @@ import java.util.Optional;
                                 message: |
                                   Full table name: {{parents[1].taskrun.value }}_{{parent.taskrun.value}}_{{taskrun.value}}
                                   Direct/current loop (months): {{taskrun.value}}
-                                  Value of loop one higher up (years): {{parents[0].taskrun.value}} 
+                                  Value of loop one higher up (years): {{parents[0].taskrun.value}}
                                   Further up (table types): {{parents[1].taskrun.value}}
                 """
-        ),        
+        ),
     }
 )
 public class ForEach extends Sequential implements FlowableTask<VoidOutput> {
diff --git a/platform/build.gradle b/platform/build.gradle
index a7c9db659..ea480aed5 100644
--- a/platform/build.gradle
+++ b/platform/build.gradle
@@ -21,7 +21,7 @@ dependencies {
     def kafkaVersion = "3.9.0"
     def opensearchVersion = "2.19.0"
     def opensearchRestVersion = "2.18.0"
-    def flyingSaucerVersion = "9.11.2"
+    def flyingSaucerVersion = "9.11.3"
     def jacksonVersion = "2.18.2"
 
     // as Jackson is in the Micronaut BOM, to force its version we need to use enforcedPlatform but it didn't really work, see later :(
@@ -32,8 +32,8 @@ dependencies {
     api platform("io.qameta.allure:allure-bom:2.29.1")
     // we define cloud bom here for GCP, Azure and AWS so they are aligned for all plugins that use them (secret, storage, oss and ee plugins)
     api platform('com.google.cloud:libraries-bom:26.53.0')
-    api platform("com.azure:azure-sdk-bom:1.2.30")
-    api platform('software.amazon.awssdk:bom:2.30.6')
+    api platform("com.azure:azure-sdk-bom:1.2.31")
+    api platform('software.amazon.awssdk:bom:2.30.11')
 
 
     constraints {
@@ -66,7 +66,7 @@ dependencies {
         api "org.apache.kafka:kafka-clients:$kafkaVersion"
         api "org.apache.kafka:kafka-streams:$kafkaVersion"
         // AWS CRT is not included in the AWS BOM but needed for the S3 Transfer manager
-        api 'software.amazon.awssdk.crt:aws-crt:0.33.9'
+        api 'software.amazon.awssdk.crt:aws-crt:0.33.11'
 
         // we need at least 0.14, it could be removed when Micronaut contains a recent only version in their BOM
         api "io.micrometer:micrometer-core:1.14.3"
diff --git a/ui/src/components/code/components/inputs/InputText.vue b/ui/src/components/code/components/inputs/InputText.vue
index 146a9f1de..e34186909 100644
--- a/ui/src/components/code/components/inputs/InputText.vue
+++ b/ui/src/components/code/components/inputs/InputText.vue
@@ -16,6 +16,8 @@
 <script setup lang="ts">
     import {ref, watch} from "vue";
 
+    defineOptions({inheritAttrs: false});
+
     const emits = defineEmits(["update:modelValue"]);
     const props = defineProps({
         modelValue: {type: [String, Number, Boolean], default: undefined},
diff --git a/ui/src/components/code/styles/code.scss b/ui/src/components/code/styles/code.scss
index 3172f843c..7672e9a5d 100644
--- a/ui/src/components/code/styles/code.scss
+++ b/ui/src/components/code/styles/code.scss
@@ -53,7 +53,8 @@ $code-font-sm: var(--el-font-size-small);
     font-size: $code-font-sm;
 }
 
-.delete {
+.delete,
+.reorder {
     cursor: pointer;
     padding-left: 0;
     color: $code-gray-700;
@@ -64,7 +65,8 @@ $code-font-sm: var(--el-font-size-small);
     :deep(*) {
         --el-disabled-text-color: #{$code-gray-700};
 
-        .el-input__inner {
+        .el-input__inner,
+        .el-textarea__inner {
             color: $code-gray-700;
             font-size: $code-font-sm;
         }
diff --git a/ui/src/components/demo/Layout.vue b/ui/src/components/demo/Layout.vue
index 1feb36f21..5519ba10c 100644
--- a/ui/src/components/demo/Layout.vue
+++ b/ui/src/components/demo/Layout.vue
@@ -83,10 +83,10 @@
             z-index: -2;
             background-image: linear-gradient(138.8deg, #CCE8FE 0%, #CDA0FF 27.03%, #8489F5 41.02%, #CDF1FF 68.68%, #B591E9 94%, #CCE8FE 100%);
             background-size: 200% 200%;
-            top: -2px;
-            bottom: -2px;
-            left: -2px;
-            right: -2px;
+            top: 0px;
+            bottom: 0px;
+            left: 0px;
+            right: 0px;
             animation: move-border 3s linear infinite;
         }
 
@@ -94,11 +94,11 @@
 
         .enterprise-tag::after{
             z-index: -1;
-            background: $base-gray-200;
-            top: -1px;
-            left: -1px;
-            bottom: -1px;
-            right: -1px;
+            background: $base-gray-100;
+            top: 1px;
+            left: 1px;
+            bottom: 1px;
+            right: 1px;
             html.dark & {
                 background: $base-gray-400;
             }
@@ -107,14 +107,12 @@
         .enterprise-tag{
             position: relative;
             background: $base-gray-200;
-            border: 1px solid transparent;
-            padding: 0 1rem;
+            padding: .125rem 1rem;
             border-radius: 1rem;
             display: inline-block;
             z-index: 2;
             html.dark &{
                 background: #FBFBFB26;
-                border-color: #FFFFFF;
             }
             .flare{
                 display: none;
diff --git a/ui/src/components/filter/KestraFilter.vue b/ui/src/components/filter/KestraFilter.vue
index a6e659e24..1e5d0cd00 100644
--- a/ui/src/components/filter/KestraFilter.vue
+++ b/ui/src/components/filter/KestraFilter.vue
@@ -115,7 +115,7 @@
                     class="rounded-0"
                 />
             </KestraIcon>
-            <Save :disabled="!currentFilters.length" :prefix="ITEMS_PREFIX" :current-filters />
+            <Save :disabled="!currentFilters.length" :prefix="ITEMS_PREFIX" :current="currentFilters" />
         </el-button-group>
 
         <el-button-group
diff --git a/ui/src/components/flows/TaskEditor.vue b/ui/src/components/flows/TaskEditor.vue
index 90bd113f9..10a5fd4e8 100644
--- a/ui/src/components/flows/TaskEditor.vue
+++ b/ui/src/components/flows/TaskEditor.vue
@@ -32,6 +32,7 @@
     import {SECTIONS} from "../../utils/constants.js";
 
     export default {
+        inheritAttrs: false,
         computed: {
             ...mapGetters("flow", ["taskError"]),
         },
diff --git a/ui/src/components/flows/tasks/TaskArray.vue b/ui/src/components/flows/tasks/TaskArray.vue
index b019037ce..392808c7d 100644
--- a/ui/src/components/flows/tasks/TaskArray.vue
+++ b/ui/src/components/flows/tasks/TaskArray.vue
@@ -3,9 +3,13 @@
         v-for="(element, index) in items"
         :key="'array-' + index"
         :gutter="10"
-        class="w-100 mb-2"
+        class="w-100"
     >
-        <el-col :span="22">
+        <el-col :span="2" class="d-flex flex-column mt-1 mb-2 reorder">
+            <ChevronUp @click.prevent.stop="moveItem(index, 'up')" />
+            <ChevronDown @click.prevent.stop="moveItem(index, 'down')" />
+        </el-col>
+        <el-col :span="20">
             <InputText
                 :model-value="element"
                 @update:model-value="(v) => handleInput(v, index)"
@@ -23,11 +27,13 @@
 <script setup lang="ts">
     import {ref} from "vue";
 
-    import {DeleteOutline} from "../../code/utils/icons";
+    import {DeleteOutline, ChevronUp, ChevronDown} from "../../code/utils/icons";
 
     import InputText from "../../code/components/inputs/InputText.vue";
     import Add from "../../code/components/Add.vue";
 
+    defineOptions({inheritAttrs: false});
+
     const emits = defineEmits(["update:modelValue"]);
     const props = defineProps({modelValue: {type: Array, default: undefined}});
 
@@ -48,4 +54,22 @@
         items.value.splice(index, 1);
         emits("update:modelValue", items.value);
     };
+    const moveItem = (index: number, direction: "up" | "down") => {
+        if (direction === "up" && index > 0) {
+            [items.value[index - 1], items.value[index]] = [
+                items.value[index],
+                items.value[index - 1],
+            ];
+        } else if (direction === "down" && index < items.value.length - 1) {
+            [items.value[index + 1], items.value[index]] = [
+                items.value[index],
+                items.value[index + 1],
+            ];
+        }
+        emits("update:modelValue", items.value);
+    };
 </script>
+
+<style scoped lang="scss">
+@import "../../code/styles/code.scss";
+</style>
diff --git a/ui/src/components/inputs/EditorView.vue b/ui/src/components/inputs/EditorView.vue
index 57bdef273..edf9f021c 100644
--- a/ui/src/components/inputs/EditorView.vue
+++ b/ui/src/components/inputs/EditorView.vue
@@ -940,15 +940,13 @@
     };
 
     const onUpdateMetadata = (event, shouldSave) => {
-        metadata.value = event;
-
         if(shouldSave) {
-            metadata.value = {...metadata.value, ...event};
+            metadata.value = {...metadata.value, ...(event.concurrency.limit === 0 ? {concurrency: null} : event)};
             onSaveMetadata();
             validateFlow(flowYaml.value)
 
         } else {
-            metadata.value = event;
+            metadata.value = event.concurrency.limit === 0 ?  {concurrency: null} : event;
         }
     };
 
diff --git a/ui/src/components/layout/SideBar.vue b/ui/src/components/layout/SideBar.vue
index 1c56bdb7a..8defb28be 100644
--- a/ui/src/components/layout/SideBar.vue
+++ b/ui/src/components/layout/SideBar.vue
@@ -258,7 +258,7 @@
             color: var(--ks-content-primary);
             box-shadow: none;
 
-            &_active, body &_active:hover, &:hover, &.vsm--link_hover, &.vsm--link_open {
+            &_active, body &_active:hover, &.vsm--link_open, &.vsm--link_open:hover {
                 background-color: var(--ks-button-background-primary);
                 color: var(--ks-button-content-primary);
                 font-weight: normal;
@@ -269,7 +269,7 @@
             }
 
             &:hover, body &_hover {
-                background-color: var(--ks-button-background-primary);
+                background-color: var(--ks-button-background-secondary);
             }
 
             .el-tooltip__trigger {
diff --git a/ui/src/components/logs/LogLine.vue b/ui/src/components/logs/LogLine.vue
index 70a13b481..2d0c7c21c 100644
--- a/ui/src/components/logs/LogLine.vue
+++ b/ui/src/components/logs/LogLine.vue
@@ -218,6 +218,9 @@ div.line {
     }
 
     .log-content {
+        // prevent Firefox word breaks 
+        flex-grow: 1;
+
         .header > * + * {
             margin-left: 1rem;
         }
diff --git a/ui/src/components/plugins/PluginSelect.vue b/ui/src/components/plugins/PluginSelect.vue
index 85acbca43..337bcac7d 100644
--- a/ui/src/components/plugins/PluginSelect.vue
+++ b/ui/src/components/plugins/PluginSelect.vue
@@ -3,7 +3,6 @@
         :model-value="modelValue"
         :placeholder="$t('no_code.creation.select', {section: section.toLowerCase().slice(0, -1)})"
         filterable
-        clearable
         @update:model-value="onInput"
     >
         <el-option
diff --git a/webserver/src/main/java/io/kestra/webserver/controllers/api/StaticFilter.java b/webserver/src/main/java/io/kestra/webserver/controllers/api/StaticFilter.java
index f80f01bd6..8b7623bb3 100644
--- a/webserver/src/main/java/io/kestra/webserver/controllers/api/StaticFilter.java
+++ b/webserver/src/main/java/io/kestra/webserver/controllers/api/StaticFilter.java
@@ -60,7 +60,7 @@ public class StaticFilter implements HttpServerFilter {
                                 .filter(n -> n.getFile().getAbsoluteFile().toString().endsWith("ui/index.html"))
                                 .map(throwFunction(n -> IOUtils.toString(
                                     Objects.requireNonNull(StaticFilter.class.getClassLoader().getResourceAsStream("ui/index.html")),
-                                    Charsets.UTF_8
+                                    StandardCharsets.UTF_8
                                 )))
                         )
                         .filter(Optional::isPresent)


Test patch:
diff --git a/cli/src/test/java/io/kestra/cli/AppTest.java b/cli/src/test/java/io/kestra/cli/AppTest.java
index 9f14d4aae..d0075be23 100644
--- a/cli/src/test/java/io/kestra/cli/AppTest.java
+++ b/cli/src/test/java/io/kestra/cli/AppTest.java
@@ -45,4 +45,20 @@ class AppTest {
             assertThat(out.toString(), startsWith("Usage: kestra server " + serverType));
         }
     }
+
+    @Test
+    void missingRequiredParamsPrintHelpInsteadOfException() {
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        System.setErr(new PrintStream(out));
+
+        final String[] argsWithMissingParams = new String[]{"flow", "namespace", "update"};
+
+        try (ApplicationContext ctx = App.applicationContext(App.class, argsWithMissingParams)) {
+            new CommandLine(App.class, new MicronautFactory(ctx)).execute(argsWithMissingParams);
+
+            assertThat(out.toString(), startsWith("Missing required parameters: "));
+            assertThat(out.toString(), containsString("Usage: kestra flow namespace update "));
+            assertThat(out.toString(), not(containsString("MissingParameterException: ")));
+        }
+    }
 }
diff --git a/core/src/test/java/io/kestra/core/docs/ClassPluginDocumentationTest.java b/core/src/test/java/io/kestra/core/docs/ClassPluginDocumentationTest.java
index 38db37c9b..6a560bd9b 100644
--- a/core/src/test/java/io/kestra/core/docs/ClassPluginDocumentationTest.java
+++ b/core/src/test/java/io/kestra/core/docs/ClassPluginDocumentationTest.java
@@ -149,7 +149,7 @@ class ClassPluginDocumentationTest {
             assertThat(oneOf.getFirst().get("type"), is("integer"));
             assertThat(oneOf.getFirst().get("$dynamic"), is(true));
             assertThat(oneOf.get(1).get("type"), is("string"));
-            assertThat(oneOf.get(1).get("pattern"), is(".*{{.*}}.*"));
+//            assertThat(oneOf.get(1).get("pattern"), is(".*{{.*}}.*"));
 
             Map<String, Object> withDefault = (Map<String, Object>) properties.get("withDefault");
             assertThat(withDefault.get("type"), is("string"));
diff --git a/core/src/test/java/io/kestra/core/http/client/HttpClientTest.java b/core/src/test/java/io/kestra/core/http/client/HttpClientTest.java
index fe36fa920..78e38d69f 100644
--- a/core/src/test/java/io/kestra/core/http/client/HttpClientTest.java
+++ b/core/src/test/java/io/kestra/core/http/client/HttpClientTest.java
@@ -1,7 +1,6 @@
 package io.kestra.core.http.client;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.google.common.base.Charsets;
 import com.google.common.net.HttpHeaders;
 import io.kestra.core.exceptions.IllegalVariableEvaluationException;
 import io.kestra.core.http.HttpRequest;
@@ -420,7 +419,7 @@ class HttpClientTest {
                             try (var inputStream = fileUpload.getInputStream()) {
                                 sink.next(new AbstractMap.SimpleEntry<>(
                                     fileUpload.getName(),
-                                    IOUtils.toString(inputStream, Charsets.UTF_8)
+                                    IOUtils.toString(inputStream, StandardCharsets.UTF_8)
                                 ));
                             }
                         } catch (IOException e) {
diff --git a/core/src/test/java/io/kestra/plugin/core/http/RequestTest.java b/core/src/test/java/io/kestra/plugin/core/http/RequestTest.java
index 4bed99e34..0c78884b6 100644
--- a/core/src/test/java/io/kestra/plugin/core/http/RequestTest.java
+++ b/core/src/test/java/io/kestra/plugin/core/http/RequestTest.java
@@ -1,7 +1,6 @@
 package io.kestra.plugin.core.http;
 
 import com.devskiller.friendly_id.FriendlyId;
-import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableMap;
 import io.kestra.core.http.client.HttpClientRequestException;
 import io.kestra.core.http.client.HttpClientResponseException;
@@ -350,7 +349,7 @@ class RequestTest {
 
             Request.Output output = task.run(runContext);
 
-            assertThat(output.getBody(), is("world > " + IOUtils.toString(new FileInputStream(file), Charsets.UTF_8)));
+            assertThat(output.getBody(), is("world > " + IOUtils.toString(new FileInputStream(file), StandardCharsets.UTF_8)));
             assertThat(output.getCode(), is(200));
         }
     }
@@ -384,7 +383,7 @@ class RequestTest {
 
             Request.Output output = task.run(runContext);
 
-            assertThat(output.getBody(), is("world > " + IOUtils.toString(new FileInputStream(file), Charsets.UTF_8)));
+            assertThat(output.getBody(), is("world > " + IOUtils.toString(new FileInputStream(file), StandardCharsets.UTF_8)));
             assertThat(output.getCode(), is(200));
         }
     }
diff --git a/tests/src/main/java/io/kestra/core/utils/TestsUtils.java b/tests/src/main/java/io/kestra/core/utils/TestsUtils.java
index 9ede827c2..62968e27d 100644
--- a/tests/src/main/java/io/kestra/core/utils/TestsUtils.java
+++ b/tests/src/main/java/io/kestra/core/utils/TestsUtils.java
@@ -1,7 +1,6 @@
 package io.kestra.core.utils;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.base.Charsets;
 import com.google.common.io.Files;
 import io.kestra.core.exceptions.DeserializationException;
 import io.kestra.core.models.conditions.ConditionContext;
@@ -13,7 +12,6 @@ import io.kestra.core.models.flows.State;
 import io.kestra.core.models.tasks.Task;
 import io.kestra.core.models.triggers.AbstractTrigger;
 import io.kestra.core.models.triggers.Trigger;
-import io.kestra.core.models.triggers.TriggerContext;
 import io.kestra.core.queues.QueueInterface;
 import io.kestra.core.repositories.LocalFlowRepositoryLoader;
 import io.kestra.core.runners.DefaultRunContext;
@@ -26,6 +24,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.time.ZonedDateTime;
 import java.util.*;
@@ -44,7 +43,7 @@ abstract public class TestsUtils {
         URL resource = TestsUtils.class.getClassLoader().getResource(path);
         assert resource != null;
 
-        String read = Files.asCharSource(new File(resource.getFile()), Charsets.UTF_8).read();
+        String read = Files.asCharSource(new File(resource.getFile()), StandardCharsets.UTF_8).read();
 
         return mapper.readValue(read, cls);
     }
diff --git a/ui/tests/storybook/components/logs/LogLine.stories.jsx b/ui/tests/storybook/components/logs/LogLine.stories.jsx
index 4af9f8fd1..593ade74a 100644
--- a/ui/tests/storybook/components/logs/LogLine.stories.jsx
+++ b/ui/tests/storybook/components/logs/LogLine.stories.jsx
@@ -157,7 +157,7 @@ WithRouterLinkInMarkdown.play = async ({canvasElement}) => {
     const links = can.getAllByRole("link");
     expect(links[3]).toHaveTextContent("4Q9z27FJ26FRIhdv037HtF");
     expect(links[4]).toHaveTextContent("company.team.child");
-} 
+}
 
 export const WithExcludedMetas = Template.bind({});
 WithExcludedMetas.args = {
@@ -174,7 +174,7 @@ WithExcludedMetas.args = {
     filter: "",
     excludeMetas: ["namespace", "flowId"],
     title: false
-}; 
+};
 
 export const MultipleLogLinesWithAllLevels = () => {
     return (
@@ -186,4 +186,13 @@ export const MultipleLogLinesWithAllLevels = () => {
             }
         </ElCard>
     );
-};
\ No newline at end of file
+};
+
+// reproduction of https://github.com/kestra-io/kestra/pull/7133
+export const ShortLogWithoutContext = () => {
+    return (
+        <ElCard>
+            <LogLine log={{level: "INFO", message: "test"}} />
+        </ElCard>
+    );
+}
\ No newline at end of file