Repository: kestra-io/kestra
Pull request #5753 (2024-11-04 05:56:34)

chore(deps): bump bouncycastleVersion from 1.78.1 to 1.79
Bumps `bouncycastleVersion` from 1.78.1 to 1.79.
Updates `org.bouncycastle:bcprov-jdk18on` from 1.78.1 to 1.79
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html">org.bouncycastle:bcprov-jdk18on's changelog</a>.</em></p>
<blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.1.1 Version<!-- raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.80<!-- raw HTML omitted -->
Date:      TBD.</p>
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.2.1 Version<!-- raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.79<!-- raw HTML omitted -->
Date:      2024, 30th October.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/bcgit/bc-java/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `org.bouncycastle:bcpg-jdk18on` from 1.78.1 to 1.79
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html">org.bouncycastle:bcpg-jdk18on's changelog</a>.</em></p>
<blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.1.1 Version<!-- raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.80<!-- raw HTML omitted -->
Date:      TBD.</p>
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.2.1 Version<!-- raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.79<!-- raw HTML omitted -->
Date:      2024, 30th October.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/bcgit/bc-java/commits">compare view</a></li>
</ul>
</details>
<br />


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/.github/workflows/check.yml b/.github/workflows/check.yml
index 16acd1957..ff844830f 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -97,7 +97,7 @@ jobs:
 
       # report test
       - name: Test Report
-        uses: mikepenz/action-junit-report@v4
+        uses: mikepenz/action-junit-report@v5
         if: success() || failure()
         with:
           report_paths: '**/build/test-results/**/TEST-*.xml'
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 02b367d20..1dfc5c40b 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -265,7 +265,7 @@ jobs:
 
       # report test
       - name: Test Report
-        uses: mikepenz/action-junit-report@v4
+        uses: mikepenz/action-junit-report@v5
         if: success() || failure()
         with:
           report_paths: '**/build/test-results/**/TEST-*.xml'
diff --git a/build.gradle b/build.gradle
index 22e7c6902..8aa78670b 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.3"
+    id "com.gradleup.shadow" version "8.3.5"
     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 "11.0.0" apply false
+    id "org.owasp.dependencycheck" version "11.1.0" apply false
 }
 
 idea {
diff --git a/cli/src/main/java/io/kestra/cli/AbstractValidateCommand.java b/cli/src/main/java/io/kestra/cli/AbstractValidateCommand.java
index 8d5fce6ee..59533c908 100644
--- a/cli/src/main/java/io/kestra/cli/AbstractValidateCommand.java
+++ b/cli/src/main/java/io/kestra/cli/AbstractValidateCommand.java
@@ -2,7 +2,7 @@ package io.kestra.cli;
 
 import io.kestra.core.models.validations.ModelValidator;
 import io.kestra.core.models.validations.ValidateConstraintViolation;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.micronaut.core.type.Argument;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.MediaType;
@@ -62,7 +62,7 @@ public abstract class AbstractValidateCommand extends AbstractApiCommand {
     public static String buildYamlBody(Path directory) throws IOException {
         try(var files = Files.walk(directory)) {
             return files.filter(Files::isRegularFile)
-                .filter(YamlFlowParser::isValidExtension)
+                .filter(YamlParser::isValidExtension)
                 .map(throwFunction(path -> Files.readString(path, Charset.defaultCharset())))
                 .collect(Collectors.joining("\n---\n"));
         }
@@ -71,7 +71,7 @@ public abstract class AbstractValidateCommand extends AbstractApiCommand {
     // bug in micronaut, we can't inject YamlFlowParser & ModelValidator, so we inject from implementation
     public Integer call(
         Class<?> cls,
-        YamlFlowParser yamlFlowParser,
+        YamlParser yamlParser,
         ModelValidator modelValidator,
         Function<Object, String> identity,
         Function<Object, List<String>> warningsFunction,
@@ -85,10 +85,10 @@ public abstract class AbstractValidateCommand extends AbstractApiCommand {
         if(this.local) {
             try(var files = Files.walk(directory)) {
                 files.filter(Files::isRegularFile)
-                    .filter(YamlFlowParser::isValidExtension)
+                    .filter(YamlParser::isValidExtension)
                     .forEach(path -> {
                         try {
-                            Object parse = yamlFlowParser.parse(path.toFile(), cls);
+                            Object parse = yamlParser.parse(path.toFile(), cls);
                             modelValidator.validate(parse);
                             stdOut("@|green \u2713|@ - " + identity.apply(parse));
                             List<String> warnings = warningsFunction.apply(parse);
diff --git a/cli/src/main/java/io/kestra/cli/commands/flows/FlowDotCommand.java b/cli/src/main/java/io/kestra/cli/commands/flows/FlowDotCommand.java
index 5eb8c78a2..246908b53 100644
--- a/cli/src/main/java/io/kestra/cli/commands/flows/FlowDotCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/flows/FlowDotCommand.java
@@ -3,7 +3,7 @@ package io.kestra.cli.commands.flows;
 import io.kestra.cli.AbstractCommand;
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.hierarchies.GraphCluster;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.Graph2DotService;
 import io.kestra.core.utils.GraphUtils;
 import io.micronaut.context.ApplicationContext;
@@ -29,7 +29,7 @@ public class FlowDotCommand extends AbstractCommand {
     public Integer call() throws Exception {
         super.call();
 
-        YamlFlowParser parser = applicationContext.getBean(YamlFlowParser.class);
+        YamlParser parser = applicationContext.getBean(YamlParser.class);
         Flow flow = parser.parse(file.toFile(), Flow.class);
 
         GraphCluster graph = GraphUtils.of(flow, null);
diff --git a/cli/src/main/java/io/kestra/cli/commands/flows/FlowExpandCommand.java b/cli/src/main/java/io/kestra/cli/commands/flows/FlowExpandCommand.java
index aa885b69c..3ca68dbdd 100644
--- a/cli/src/main/java/io/kestra/cli/commands/flows/FlowExpandCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/flows/FlowExpandCommand.java
@@ -3,7 +3,7 @@ package io.kestra.cli.commands.flows;
 import io.kestra.cli.AbstractCommand;
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import jakarta.inject.Inject;
 import picocli.CommandLine;
 
@@ -21,7 +21,7 @@ public class FlowExpandCommand extends AbstractCommand {
     private Path file;
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private ModelValidator modelValidator;
@@ -31,7 +31,7 @@ public class FlowExpandCommand extends AbstractCommand {
         super.call();
         stdErr("Warning, this functionality is deprecated and will be removed at some point.");
         String content = IncludeHelperExpander.expand(Files.readString(file), file.getParent());
-        Flow flow = yamlFlowParser.parse(content, Flow.class);
+        Flow flow = yamlParser.parse(content, Flow.class);
         modelValidator.validate(flow);
         stdOut(content);
         return 0;
diff --git a/cli/src/main/java/io/kestra/cli/commands/flows/FlowUpdatesCommand.java b/cli/src/main/java/io/kestra/cli/commands/flows/FlowUpdatesCommand.java
index c8de5e23c..5b95e2598 100644
--- a/cli/src/main/java/io/kestra/cli/commands/flows/FlowUpdatesCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/flows/FlowUpdatesCommand.java
@@ -2,7 +2,7 @@ package io.kestra.cli.commands.flows;
 
 import io.kestra.cli.AbstractApiCommand;
 import io.kestra.cli.AbstractValidateCommand;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.micronaut.core.type.Argument;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.MediaType;
@@ -41,7 +41,7 @@ public class FlowUpdatesCommand extends AbstractApiCommand {
         try (var files = Files.walk(directory)) {
             List<String> flows = files
                 .filter(Files::isRegularFile)
-                .filter(YamlFlowParser::isValidExtension)
+                .filter(YamlParser::isValidExtension)
                 .map(path -> {
                     try {
                         return IncludeHelperExpander.expand(Files.readString(path, Charset.defaultCharset()), path.getParent());
diff --git a/cli/src/main/java/io/kestra/cli/commands/flows/FlowValidateCommand.java b/cli/src/main/java/io/kestra/cli/commands/flows/FlowValidateCommand.java
index 2b3abb521..038745c8a 100644
--- a/cli/src/main/java/io/kestra/cli/commands/flows/FlowValidateCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/flows/FlowValidateCommand.java
@@ -3,7 +3,7 @@ package io.kestra.cli.commands.flows;
 import io.kestra.cli.AbstractValidateCommand;
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.FlowService;
 import jakarta.inject.Inject;
 import picocli.CommandLine;
@@ -17,7 +17,7 @@ import java.util.List;
 )
 public class FlowValidateCommand extends AbstractValidateCommand {
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private ModelValidator modelValidator;
@@ -29,7 +29,7 @@ public class FlowValidateCommand extends AbstractValidateCommand {
     public Integer call() throws Exception {
         return this.call(
             Flow.class,
-            yamlFlowParser,
+            yamlParser,
             modelValidator,
             (Object object) -> {
                 Flow flow = (Flow) object;
diff --git a/cli/src/main/java/io/kestra/cli/commands/flows/namespaces/FlowNamespaceUpdateCommand.java b/cli/src/main/java/io/kestra/cli/commands/flows/namespaces/FlowNamespaceUpdateCommand.java
index 0ff05ef36..67b976c3d 100644
--- a/cli/src/main/java/io/kestra/cli/commands/flows/namespaces/FlowNamespaceUpdateCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/flows/namespaces/FlowNamespaceUpdateCommand.java
@@ -3,7 +3,7 @@ package io.kestra.cli.commands.flows.namespaces;
 import io.kestra.cli.AbstractValidateCommand;
 import io.kestra.cli.commands.AbstractServiceNamespaceUpdateCommand;
 import io.kestra.cli.commands.flows.IncludeHelperExpander;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.micronaut.core.type.Argument;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.MediaType;
@@ -28,7 +28,7 @@ import java.util.List;
 @Slf4j
 public class FlowNamespaceUpdateCommand extends AbstractServiceNamespaceUpdateCommand {
     @Inject
-    public YamlFlowParser yamlFlowParser;
+    public YamlParser yamlParser;
 
     @CommandLine.Option(names = {"--override-namespaces"}, negatable = true, description = "replace namespace of all flows by the one provided")
     public boolean override = false;
@@ -41,7 +41,7 @@ public class FlowNamespaceUpdateCommand extends AbstractServiceNamespaceUpdateCo
         try (var files = Files.walk(directory)) {
             List<String> flows = files
                 .filter(Files::isRegularFile)
-                .filter(YamlFlowParser::isValidExtension)
+                .filter(YamlParser::isValidExtension)
                 .map(path -> {
                     try {
                         return IncludeHelperExpander.expand(Files.readString(path, Charset.defaultCharset()), path.getParent());
diff --git a/cli/src/main/java/io/kestra/cli/commands/templates/TemplateValidateCommand.java b/cli/src/main/java/io/kestra/cli/commands/templates/TemplateValidateCommand.java
index fec68750c..0d09dc99e 100644
--- a/cli/src/main/java/io/kestra/cli/commands/templates/TemplateValidateCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/templates/TemplateValidateCommand.java
@@ -4,7 +4,7 @@ import io.kestra.cli.AbstractValidateCommand;
 import io.kestra.core.models.templates.Template;
 import io.kestra.core.models.templates.TemplateEnabled;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import jakarta.inject.Inject;
 import picocli.CommandLine;
 
@@ -17,7 +17,7 @@ import java.util.Collections;
 @TemplateEnabled
 public class TemplateValidateCommand extends AbstractValidateCommand {
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private ModelValidator modelValidator;
@@ -26,7 +26,7 @@ public class TemplateValidateCommand extends AbstractValidateCommand {
     public Integer call() throws Exception {
         return this.call(
             Template.class,
-            yamlFlowParser,
+            yamlParser,
             modelValidator,
             (Object object) -> {
                 Template template = (Template) object;
diff --git a/cli/src/main/java/io/kestra/cli/commands/templates/namespaces/TemplateNamespaceUpdateCommand.java b/cli/src/main/java/io/kestra/cli/commands/templates/namespaces/TemplateNamespaceUpdateCommand.java
index e522416cd..5e06153bc 100644
--- a/cli/src/main/java/io/kestra/cli/commands/templates/namespaces/TemplateNamespaceUpdateCommand.java
+++ b/cli/src/main/java/io/kestra/cli/commands/templates/namespaces/TemplateNamespaceUpdateCommand.java
@@ -2,10 +2,9 @@ package io.kestra.cli.commands.templates.namespaces;
 
 import io.kestra.cli.AbstractValidateCommand;
 import io.kestra.cli.commands.AbstractServiceNamespaceUpdateCommand;
-import io.kestra.cli.commands.templates.TemplateValidateCommand;
 import io.kestra.core.models.templates.Template;
 import io.kestra.core.models.templates.TemplateEnabled;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.micronaut.core.type.Argument;
 import io.micronaut.http.HttpRequest;
 import io.micronaut.http.MutableHttpRequest;
@@ -17,7 +16,7 @@ import picocli.CommandLine;
 
 import java.nio.file.Files;
 import java.util.List;
-import java.util.stream.Collectors;
+
 import jakarta.validation.ConstraintViolationException;
 
 @CommandLine.Command(
@@ -29,7 +28,7 @@ import jakarta.validation.ConstraintViolationException;
 @TemplateEnabled
 public class TemplateNamespaceUpdateCommand extends AbstractServiceNamespaceUpdateCommand {
     @Inject
-    public YamlFlowParser yamlFlowParser;
+    public YamlParser yamlParser;
 
     @Override
     public Integer call() throws Exception {
@@ -38,8 +37,8 @@ public class TemplateNamespaceUpdateCommand extends AbstractServiceNamespaceUpda
         try (var files = Files.walk(directory)) {
             List<Template> templates = files
                 .filter(Files::isRegularFile)
-                .filter(YamlFlowParser::isValidExtension)
-                .map(path -> yamlFlowParser.parse(path.toFile(), Template.class))
+                .filter(YamlParser::isValidExtension)
+                .map(path -> yamlParser.parse(path.toFile(), Template.class))
                 .toList();
 
             if (templates.isEmpty()) {
diff --git a/cli/src/main/java/io/kestra/cli/services/FileChangedEventListener.java b/cli/src/main/java/io/kestra/cli/services/FileChangedEventListener.java
index 622f02a6b..95b1c0f73 100644
--- a/cli/src/main/java/io/kestra/cli/services/FileChangedEventListener.java
+++ b/cli/src/main/java/io/kestra/cli/services/FileChangedEventListener.java
@@ -5,7 +5,7 @@ import io.kestra.core.models.flows.FlowWithPath;
 import io.kestra.core.models.flows.FlowWithSource;
 import io.kestra.core.models.validations.ModelValidator;
 import io.kestra.core.repositories.FlowRepositoryInterface;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.FlowListenersInterface;
 import io.micronaut.context.annotation.Requires;
 import io.micronaut.context.annotation.Value;
@@ -37,7 +37,7 @@ public class FileChangedEventListener {
     private FlowRepositoryInterface flowRepositoryInterface;
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private ModelValidator modelValidator;
@@ -229,7 +229,7 @@ public class FileChangedEventListener {
 
     private Optional<Flow> parseFlow(String content, Path entry) {
         try {
-            Flow flow = yamlFlowParser.parse(content, Flow.class);
+            Flow flow = yamlParser.parse(content, Flow.class);
             modelValidator.validate(flow);
             return Optional.of(flow);
         } catch (ConstraintViolationException e) {
diff --git a/core/src/main/java/io/kestra/core/repositories/LocalFlowRepositoryLoader.java b/core/src/main/java/io/kestra/core/repositories/LocalFlowRepositoryLoader.java
index eec5636e5..01905a15a 100644
--- a/core/src/main/java/io/kestra/core/repositories/LocalFlowRepositoryLoader.java
+++ b/core/src/main/java/io/kestra/core/repositories/LocalFlowRepositoryLoader.java
@@ -2,7 +2,7 @@ package io.kestra.core.repositories;
 
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.PluginDefaultService;
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
@@ -19,7 +19,6 @@ import java.nio.file.*;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -31,7 +30,7 @@ import static io.kestra.core.utils.Rethrow.throwConsumer;
 @Slf4j
 public class LocalFlowRepositoryLoader {
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private FlowRepositoryInterface flowRepository;
@@ -72,13 +71,13 @@ public class LocalFlowRepositoryLoader {
         Map<String, Flow> flowByUidInRepository = flowRepository.findAllForAllTenants().stream()
             .collect(Collectors.toMap(Flow::uidWithoutRevision, Function.identity()));
         List<Path> list = Files.walk(basePath.toPath())
-            .filter(YamlFlowParser::isValidExtension)
+            .filter(YamlParser::isValidExtension)
             .toList();
 
         for (Path file : list) {
             try {
                 String flowSource = Files.readString(Path.of(file.toFile().getPath()), Charset.defaultCharset());
-                Flow parse = yamlFlowParser.parse(file.toFile(), Flow.class);
+                Flow parse = yamlParser.parse(file.toFile(), Flow.class);
                 modelValidator.validate(parse);
 
                 Flow inRepository = flowByUidInRepository.get(parse.uidWithoutRevision());
diff --git a/core/src/main/java/io/kestra/core/serializers/ListOrMapOfLabelDeserializer.java b/core/src/main/java/io/kestra/core/serializers/ListOrMapOfLabelDeserializer.java
index 7d2ac503a..715ed728b 100644
--- a/core/src/main/java/io/kestra/core/serializers/ListOrMapOfLabelDeserializer.java
+++ b/core/src/main/java/io/kestra/core/serializers/ListOrMapOfLabelDeserializer.java
@@ -30,14 +30,32 @@ public class ListOrMapOfLabelDeserializer extends JsonDeserializer<List<Label>>
         }
         else if (p.hasToken(JsonToken.START_OBJECT)) {
             // deserialize as map
-            Map<String, String> ret = ctxt.readValue(p, Map.class);
+            Map<String, Object> ret = ctxt.readValue(p, Map.class);
             return ret == null ? null : ret.entrySet().stream()
-                .map(entry -> new Label(entry.getKey(), entry.getValue()))
+                .map(this::validateAndCreateLabel)
                 .toList();
         }
         throw new IllegalArgumentException("Unable to deserialize value as it's neither an object neither an array");
     }
 
+    private Label validateAndCreateLabel(Map.Entry<String, Object> entry) {
+        Object value = entry.getValue();
+        if (isAllowedType(value)) {
+            return new Label(entry.getKey(), String.valueOf(value));
+        } else {
+            throw new IllegalArgumentException("Unsupported type for key: " + entry.getKey() + ", value: " + value);
+        }
+    }
+
+    private static boolean isAllowedType(Object value) {
+        return value instanceof String ||
+            value instanceof Integer ||
+            value instanceof Long ||
+            value instanceof Float ||
+            value instanceof Double ||
+            value instanceof Boolean;
+    }
+
     @Override
     public void resolve(DeserializationContext ctxt) throws JsonMappingException {}
 }
diff --git a/core/src/main/java/io/kestra/core/serializers/YamlFlowParser.java b/core/src/main/java/io/kestra/core/serializers/YamlParser.java
similarity index 92%
rename from core/src/main/java/io/kestra/core/serializers/YamlFlowParser.java
rename to core/src/main/java/io/kestra/core/serializers/YamlParser.java
index 8dbaa8650..18259b4a4 100644
--- a/core/src/main/java/io/kestra/core/serializers/YamlFlowParser.java
+++ b/core/src/main/java/io/kestra/core/serializers/YamlParser.java
@@ -21,7 +21,7 @@ import java.util.Map;
 import java.util.Set;
 
 @Singleton
-public class YamlFlowParser {
+public class YamlParser {
     private static final ObjectMapper STRICT_MAPPER = JacksonMapper.ofYaml()
         .enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION)
         .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
@@ -34,7 +34,7 @@ public class YamlFlowParser {
     }
 
     public <T> T parse(String input, Class<T> cls) {
-        return readFlow(input, cls, type(cls));
+        return read(input, cls, type(cls));
     }
 
 
@@ -59,7 +59,7 @@ public class YamlFlowParser {
     public <T> T parse(File file, Class<T> cls) throws ConstraintViolationException {
         try {
             String input = IOUtils.toString(file.toURI(), StandardCharsets.UTF_8);
-            return readFlow(input, cls, type(cls));
+            return read(input, cls, type(cls));
 
         } catch (IOException e) {
             throw new ConstraintViolationException(
@@ -77,7 +77,7 @@ public class YamlFlowParser {
         }
     }
 
-    private <T> T readFlow(String input, Class<T> objectClass, String resource) {
+    private <T> T read(String input, Class<T> objectClass, String resource) {
         try {
             return STRICT_MAPPER.readValue(input, objectClass);
         } catch (JsonProcessingException e) {
@@ -91,8 +91,7 @@ public class YamlFlowParser {
     private static <T> void jsonProcessingExceptionHandler(T target, String resource, JsonProcessingException e) throws ConstraintViolationException {
         if (e.getCause() instanceof ConstraintViolationException constraintViolationException) {
             throw constraintViolationException;
-        }
-        else if (e instanceof InvalidTypeIdException invalidTypeIdException) {
+        } else if (e instanceof InvalidTypeIdException invalidTypeIdException) {
             // This error is thrown when a non-existing task is used
             throw new ConstraintViolationException(
                 "Invalid type: " + invalidTypeIdException.getTypeId(),
@@ -113,8 +112,7 @@ public class YamlFlowParser {
                     )
                 )
             );
-        }
-        else if (e instanceof UnrecognizedPropertyException unrecognizedPropertyException) {
+        } else if (e instanceof UnrecognizedPropertyException unrecognizedPropertyException) {
             var message = unrecognizedPropertyException.getOriginalMessage() + unrecognizedPropertyException.getMessageSuffix();
             throw new ConstraintViolationException(
                 message,
@@ -127,8 +125,7 @@ public class YamlFlowParser {
                         null
                     )
                 ));
-        }
-        else {
+        } else {
             throw new ConstraintViolationException(
                 "Illegal "+ resource +" yaml: " + e.getMessage(),
                 Collections.singleton(
@@ -136,7 +133,7 @@ public class YamlFlowParser {
                         e.getCause() == null ? e.getMessage() : e.getMessage() + "\nCaused by: " + e.getCause().getMessage(),
                         target,
                         (Class<T>) target.getClass(),
-                        "flow",
+                        "yaml",
                         null
                     )
                 )
diff --git a/core/src/main/java/io/kestra/core/services/FlowService.java b/core/src/main/java/io/kestra/core/services/FlowService.java
index 2bbb3f5f3..04e8ed899 100644
--- a/core/src/main/java/io/kestra/core/services/FlowService.java
+++ b/core/src/main/java/io/kestra/core/services/FlowService.java
@@ -11,7 +11,7 @@ import io.kestra.core.models.triggers.AbstractTrigger;
 import io.kestra.core.plugins.PluginRegistry;
 import io.kestra.core.repositories.FlowRepositoryInterface;
 import io.kestra.core.serializers.JacksonMapper;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.utils.ListUtils;
 import io.micronaut.core.annotation.Nullable;
 import jakarta.inject.Inject;
@@ -54,7 +54,7 @@ public class FlowService {
     Optional<FlowRepositoryInterface> flowRepository;
 
     @Inject
-    YamlFlowParser yamlFlowParser;
+    YamlParser yamlParser;
 
     @Inject
     PluginDefaultService pluginDefaultService;
@@ -71,7 +71,7 @@ public class FlowService {
             throw noRepositoryException();
         }
 
-        FlowWithSource withTenant = yamlFlowParser.parse(source, Flow.class).toBuilder()
+        FlowWithSource withTenant = yamlParser.parse(source, Flow.class).toBuilder()
             .tenantId(tenantId)
             .build()
             .withSource(source);
diff --git a/core/src/main/java/io/kestra/core/services/PluginDefaultService.java b/core/src/main/java/io/kestra/core/services/PluginDefaultService.java
index 7d1d3d8d8..2a3728607 100644
--- a/core/src/main/java/io/kestra/core/services/PluginDefaultService.java
+++ b/core/src/main/java/io/kestra/core/services/PluginDefaultService.java
@@ -17,7 +17,7 @@ import io.kestra.core.queues.QueueFactoryInterface;
 import io.kestra.core.queues.QueueInterface;
 import io.kestra.core.runners.RunContextLogger;
 import io.kestra.core.serializers.JacksonMapper;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.utils.MapUtils;
 import io.micronaut.core.annotation.Nullable;
 import jakarta.annotation.PostConstruct;
@@ -54,7 +54,7 @@ public class PluginDefaultService {
     protected PluginGlobalDefaultConfiguration pluginGlobalDefault;
 
     @Inject
-    protected YamlFlowParser yamlFlowParser;
+    protected YamlParser yamlParser;
 
     @Inject
     @Named(QueueFactoryInterface.WORKERTASKLOG_NAMED)
@@ -224,7 +224,7 @@ public class PluginDefaultService {
             flowAsMap.put("pluginDefaults", pluginDefaults);
         }
 
-        return yamlFlowParser.parse(flowAsMap, Flow.class, false);
+        return yamlParser.parse(flowAsMap, Flow.class, false);
     }
 
     /**
diff --git a/platform/build.gradle b/platform/build.gradle
index 32485b3cc..f24b24622 100644
--- a/platform/build.gradle
+++ b/platform/build.gradle
@@ -14,7 +14,7 @@ dependencies {
     // versions for libraries with multiple module but no BOM
     def slf4jVersion = "2.0.16"
     def protobufVersion = "3.25.5"
-    def bouncycastleVersion = "1.78.1"
+    def bouncycastleVersion = "1.79"
     def aetherVersion = "1.1.0"
     def jollydayVersion = "0.29.0"
     def jsonschemaVersion = "4.35.0"
@@ -24,7 +24,7 @@ dependencies {
     def flyingSaucerVersion = "9.10.2"
 
     // as Jackson is in the Micronaut BOM, to force it's version we need to use enforcedPlatform
-    api enforcedPlatform("com.fasterxml.jackson:jackson-bom:2.18.0")
+    api enforcedPlatform("com.fasterxml.jackson:jackson-bom:2.18.1")
     // needed because httpclient fails to communicate with docker socket with > v5.4 (https://github.com/docker-java/docker-java/pull/2293#issuecomment-2435455322) and opensearch-java brings that version
     api enforcedPlatform("org.apache.httpcomponents.client5:httpclient5:5.3.1")
     api platform("io.micronaut.platform:micronaut-platform:4.6.3")
diff --git a/ui/src/components/executions/outputs/Wrapper.vue b/ui/src/components/executions/outputs/Wrapper.vue
index 50667048a..b4679df02 100644
--- a/ui/src/components/executions/outputs/Wrapper.vue
+++ b/ui/src/components/executions/outputs/Wrapper.vue
@@ -52,8 +52,8 @@
                     </code>
                 </div>
 
-                <el-collapse class="mb-3 debug bordered">
-                    <el-collapse-item>
+                <el-collapse v-model="debugCollapse" class="mb-3 debug bordered">
+                    <el-collapse-item name="debug">
                         <template #title>
                             <span>{{ t('eval.title') }}</span>
                         </template>
@@ -109,7 +109,7 @@
 </template>
 
 <script setup lang="ts">
-    import {ref, computed, shallowRef} from "vue";
+    import {ref, computed, shallowRef, onMounted} from "vue";
     import {ElTree} from "element-plus";
 
     import {useStore} from "vuex";
@@ -123,6 +123,7 @@
     import CopyToClipboard from "../../layout/CopyToClipboard.vue"
 
     import Editor from "../../inputs/Editor.vue";
+    const debugCollapse = ref("");
     const debugEditor = ref(null);
     const debugExpression = ref("");
     const computedDebugValue = computed(() => {
@@ -209,7 +210,20 @@
     };
 
     const expandedValue = ref([])
-    const selected = ref([]);
+    const selected = ref<string[]>([]);
+
+    onMounted(() => {
+        const task = outputs.value?.[1];
+        if (!task) return;
+
+        selected.value = [task.value];
+        
+        const child = task.children?.[1];
+        if (child) selected.value.push(child.value);
+
+        debugCollapse.value = "debug";
+    });
+
     const selectedValue = computed(() => {
         if (selected.value?.length) return selected.value[selected.value.length - 1];
         return undefined;
diff --git a/ui/src/components/inputs/MonacoEditor.vue b/ui/src/components/inputs/MonacoEditor.vue
index bd3273fe1..fd228c010 100644
--- a/ui/src/components/inputs/MonacoEditor.vue
+++ b/ui/src/components/inputs/MonacoEditor.vue
@@ -304,15 +304,9 @@
                 })
             }
 
-            // Expose paste function globally for testing
-            window.pasteToEditor = (textToPaste) => {
-                this.editor.executeEdits("", [
-                    {
-                        range: this.editor.getSelection(),
-                        text: textToPaste,
-                    },
-                ]);
-            };
+          // Exposing functions globally for testing putposes
+            window.pasteToEditor = (textToPaste) => {this.editor.executeEdits("", [{range: this.editor.getSelection(), text: textToPaste}])};
+            window.clearEditor = () => {this.editor.getModel().setValue("")};
         },
         beforeUnmount: function () {
             this.destroy();
@@ -734,4 +728,4 @@
     .custom-dark-vs-theme .monaco-editor .sticky-widget {
         background-color: $input-bg;
     }
-</style>
\ No newline at end of file
+</style>
diff --git a/ui/src/components/layout/BulkSelect.vue b/ui/src/components/layout/BulkSelect.vue
index 414e37330..c6b57d985 100644
--- a/ui/src/components/layout/BulkSelect.vue
+++ b/ui/src/components/layout/BulkSelect.vue
@@ -59,6 +59,10 @@
             }
         }
 
+        .el-button-group {
+            display: flex;
+        }
+        
         > * {
             padding: 0 8px;
         }
diff --git a/ui/src/components/layout/SelectTable.vue b/ui/src/components/layout/SelectTable.vue
index 25b23f8d6..503828636 100644
--- a/ui/src/components/layout/SelectTable.vue
+++ b/ui/src/components/layout/SelectTable.vue
@@ -77,6 +77,7 @@
         background-color: var(--bs-gray-100-darken-3);
         border-radius: var(--bs-border-radius-lg) var(--bs-border-radius-lg) 0 0;
         border-bottom: 1px solid var(--bs-border-color);
+        overflow-x: auto;
 
         & ~ .el-table {
             z-index: 0;
diff --git a/webserver/src/main/java/io/kestra/webserver/controllers/api/FlowController.java b/webserver/src/main/java/io/kestra/webserver/controllers/api/FlowController.java
index 3a02b8839..a229f7ce2 100644
--- a/webserver/src/main/java/io/kestra/webserver/controllers/api/FlowController.java
+++ b/webserver/src/main/java/io/kestra/webserver/controllers/api/FlowController.java
@@ -21,7 +21,7 @@ import io.kestra.core.models.validations.ValidateConstraintViolation;
 import io.kestra.core.repositories.FlowRepositoryInterface;
 import io.kestra.core.repositories.FlowTopologyRepositoryInterface;
 import io.kestra.core.serializers.JacksonMapper;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.FlowService;
 import io.kestra.core.services.GraphService;
 import io.kestra.core.services.PluginDefaultService;
@@ -90,7 +90,7 @@ public class FlowController {
     private FlowService flowService;
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private GraphService graphService;
@@ -135,7 +135,7 @@ public class FlowController {
         @Parameter(description = "The flow") @Body String flow,
         @Parameter(description = "The subflow tasks to display") @Nullable @QueryValue List<String> subflows
     ) throws ConstraintViolationException, IllegalVariableEvaluationException {
-        FlowWithSource flowParsed = yamlFlowParser.parse(flow, Flow.class).withSource(flow);
+        FlowWithSource flowParsed = yamlParser.parse(flow, Flow.class).withSource(flow);
 
         return graphService.flowGraph(flowParsed, subflows);
     }
@@ -248,7 +248,7 @@ public class FlowController {
     public HttpResponse<FlowWithSource> create(
         @Parameter(description = "The flow") @Body String flow
     ) throws ConstraintViolationException {
-        Flow flowParsed = yamlFlowParser.parse(flow, Flow.class);
+        Flow flowParsed = yamlParser.parse(flow, Flow.class);
 
         return HttpResponse.ok(doCreate(flowParsed, flow));
     }
@@ -291,7 +291,7 @@ public class FlowController {
             namespace,
             sources
                 .stream()
-                .map(flow -> FlowWithSource.of(yamlFlowParser.parse(flow, Flow.class), flow.trim()))
+                .map(flow -> FlowWithSource.of(yamlParser.parse(flow, Flow.class), flow.trim()))
                 .toList(),
             delete
         );
@@ -419,7 +419,7 @@ public class FlowController {
 
             return HttpResponse.status(HttpStatus.NOT_FOUND);
         }
-        Flow flowParsed = yamlFlowParser.parse(flow, Flow.class);
+        Flow flowParsed = yamlParser.parse(flow, Flow.class);
 
         return HttpResponse.ok(update(flowParsed, existingFlow.get(), flow));
     }
@@ -468,7 +468,7 @@ public class FlowController {
             null,
             sources
                 .stream()
-                .map(flow -> FlowWithSource.of(yamlFlowParser.parse(flow, Flow.class), flow.trim()))
+                .map(flow -> FlowWithSource.of(yamlParser.parse(flow, Flow.class), flow.trim()))
                 .toList(),
             delete
         );
@@ -566,7 +566,7 @@ public class FlowController {
                 validateConstraintViolationBuilder.index(index.getAndIncrement());
 
                 try {
-                    Flow flowParse = yamlFlowParser.parse(flow, Flow.class);
+                    Flow flowParse = yamlParser.parse(flow, Flow.class);
                     Integer sentRevision = flowParse.getRevision();
                     if (sentRevision != null) {
                         Integer lastRevision = Optional.ofNullable(flowRepository.lastRevision(tenantService.resolveTenant(), flowParse.getNamespace(), flowParse.getId()))
@@ -656,10 +656,10 @@ public class FlowController {
 
         try {
             if (section == TaskValidationType.TASKS) {
-                Task taskParse = yamlFlowParser.parse(task, Task.class);
+                Task taskParse = yamlParser.parse(task, Task.class);
                 modelValidator.validate(taskParse);
             } else if (section == TaskValidationType.TRIGGERS) {
-                AbstractTrigger triggerParse = yamlFlowParser.parse(task, AbstractTrigger.class);
+                AbstractTrigger triggerParse = yamlParser.parse(task, AbstractTrigger.class);
                 modelValidator.validate(triggerParse);
             }
         } catch (ConstraintViolationException e) {
diff --git a/webserver/src/main/java/io/kestra/webserver/controllers/api/TemplateController.java b/webserver/src/main/java/io/kestra/webserver/controllers/api/TemplateController.java
index b46a42c84..cf20e8e32 100644
--- a/webserver/src/main/java/io/kestra/webserver/controllers/api/TemplateController.java
+++ b/webserver/src/main/java/io/kestra/webserver/controllers/api/TemplateController.java
@@ -6,7 +6,7 @@ import io.kestra.core.models.validations.ManualConstraintViolation;
 import io.kestra.core.models.validations.ModelValidator;
 import io.kestra.core.models.validations.ValidateConstraintViolation;
 import io.kestra.core.repositories.TemplateRepositoryInterface;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.tenant.TenantService;
 import io.kestra.webserver.controllers.domain.IdWithNamespace;
 import io.kestra.webserver.responses.BulkResponse;
@@ -244,7 +244,7 @@ public class TemplateController {
                 ValidateConstraintViolation.ValidateConstraintViolationBuilder<?, ?> validateConstraintViolationBuilder = ValidateConstraintViolation.builder();
                 validateConstraintViolationBuilder.index(index.getAndIncrement());
                 try {
-                    Template templateParse = new YamlFlowParser().<Template>parse(template, Template.class);
+                    Template templateParse = new YamlParser().<Template>parse(template, Template.class);
 
                     validateConstraintViolationBuilder.flow(templateParse.getId());
                     validateConstraintViolationBuilder.namespace(templateParse.getNamespace());
@@ -354,7 +354,7 @@ public class TemplateController {
         if (fileName.endsWith(".yaml") || fileName.endsWith(".yml")) {
             List<String> sources = List.of(new String(fileUpload.getBytes()).split("---"));
             for (String source : sources) {
-                Template parsed = new YamlFlowParser().parse(source, Template.class);
+                Template parsed = new YamlParser().parse(source, Template.class);
                 importTemplate(parsed);
             }
         } else if (fileName.endsWith(".zip")) {
@@ -366,7 +366,7 @@ public class TemplateController {
                     }
 
                     String source = new String(archive.readAllBytes());
-                    Template parsed = new YamlFlowParser().parse(source, Template.class);
+                    Template parsed = new YamlParser().parse(source, Template.class);
                     importTemplate(parsed);
                 }
             }
diff --git a/webserver/src/main/java/io/kestra/webserver/services/FlowAutoLoaderService.java b/webserver/src/main/java/io/kestra/webserver/services/FlowAutoLoaderService.java
index 8ef8b098a..25752e7b6 100644
--- a/webserver/src/main/java/io/kestra/webserver/services/FlowAutoLoaderService.java
+++ b/webserver/src/main/java/io/kestra/webserver/services/FlowAutoLoaderService.java
@@ -2,7 +2,7 @@ package io.kestra.webserver.services;
 
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.repositories.FlowRepositoryInterface;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.PluginDefaultService;
 import io.kestra.core.utils.NamespaceUtils;
 import io.kestra.core.utils.VersionProvider;
@@ -46,7 +46,7 @@ public class FlowAutoLoaderService {
     protected HttpClient httpClient;
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private NamespaceUtils namespaceUtils;
@@ -78,7 +78,7 @@ public class FlowAutoLoaderService {
                     })
                 )
                 .map(source -> {
-                    Flow flow = yamlFlowParser.parse(source, Flow.class);
+                    Flow flow = yamlParser.parse(source, Flow.class);
                     repository.create(flow, source, pluginDefaultService.injectDefaults(flow.withSource(source)));
                     log.debug("Loaded flow '{}/{}'.", flow.getNamespace(), flow.getId());
                     return 1;


Test patch:
diff --git a/core/src/test/java/io/kestra/core/models/flows/FlowTest.java b/core/src/test/java/io/kestra/core/models/flows/FlowTest.java
index bc38366e4..d0ac3989c 100644
--- a/core/src/test/java/io/kestra/core/models/flows/FlowTest.java
+++ b/core/src/test/java/io/kestra/core/models/flows/FlowTest.java
@@ -3,7 +3,7 @@ package io.kestra.core.models.flows;
 import io.kestra.core.exceptions.InternalException;
 import io.kestra.core.models.tasks.Task;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.plugin.core.debug.Return;
 import io.kestra.core.utils.TestsUtils;
 import io.kestra.core.junit.annotations.KestraTest;
@@ -22,7 +22,7 @@ import static org.hamcrest.Matchers.*;
 @KestraTest
 class FlowTest {
     @Inject
-    YamlFlowParser yamlFlowParser = new YamlFlowParser();
+    YamlParser yamlParser = new YamlParser();
 
     @Inject
     ModelValidator modelValidator;
@@ -160,6 +160,6 @@ class FlowTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class);
+        return yamlParser.parse(file, Flow.class);
     }
 }
\ No newline at end of file
diff --git a/core/src/test/java/io/kestra/core/models/hierarchies/FlowGraphTest.java b/core/src/test/java/io/kestra/core/models/hierarchies/FlowGraphTest.java
index 94a9bb8da..d70c7892b 100644
--- a/core/src/test/java/io/kestra/core/models/hierarchies/FlowGraphTest.java
+++ b/core/src/test/java/io/kestra/core/models/hierarchies/FlowGraphTest.java
@@ -11,7 +11,7 @@ import io.kestra.core.runners.RunnerUtils;
 import io.kestra.plugin.core.trigger.Schedule;
 import io.kestra.core.repositories.TriggerRepositoryInterface;
 import io.kestra.core.runners.AbstractMemoryRunnerTest;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.services.GraphService;
 import io.kestra.plugin.core.flow.Switch;
 import io.kestra.core.utils.GraphUtils;
@@ -34,7 +34,7 @@ import static org.hamcrest.Matchers.*;
 
 class FlowGraphTest extends AbstractMemoryRunnerTest {
     @Inject
-    private YamlFlowParser yamlFlowParser = new YamlFlowParser();
+    private YamlParser yamlParser = new YamlParser();
 
     @Inject
     private GraphService graphService;
@@ -296,7 +296,7 @@ class FlowGraphTest extends AbstractMemoryRunnerTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class).withSource(Files.readString(file.toPath()));
+        return yamlParser.parse(file, Flow.class).withSource(Files.readString(file.toPath()));
     }
 
     private AbstractGraph node(FlowGraph flowGraph, String taskId) {
diff --git a/core/src/test/java/io/kestra/core/serializers/YamlFlowParserTest.java b/core/src/test/java/io/kestra/core/serializers/YamlParserTest.java
similarity index 97%
rename from core/src/test/java/io/kestra/core/serializers/YamlFlowParserTest.java
rename to core/src/test/java/io/kestra/core/serializers/YamlParserTest.java
index bfc678b1e..593f422c7 100644
--- a/core/src/test/java/io/kestra/core/serializers/YamlFlowParserTest.java
+++ b/core/src/test/java/io/kestra/core/serializers/YamlParserTest.java
@@ -31,11 +31,11 @@ import static org.hamcrest.Matchers.*;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 @KestraTest
-class YamlFlowParserTest {
+class YamlParserTest {
     private static ObjectMapper mapper = JacksonMapper.ofJson();
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private ModelValidator modelValidator;
@@ -212,7 +212,7 @@ class YamlFlowParserTest {
         TypeReference<Map<String, Object>> TYPE_REFERENCE = new TypeReference<>() {};
         Map<String, Object> flow = JacksonMapper.ofYaml().readValue(flowSource, TYPE_REFERENCE);
 
-        Flow parse = yamlFlowParser.parse(flow, Flow.class, false);
+        Flow parse = yamlParser.parse(flow, Flow.class, false);
 
         assertThat(parse.getId(), is("duplicate"));
     }
@@ -244,7 +244,7 @@ class YamlFlowParserTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class);
+        return yamlParser.parse(file, Flow.class);
     }
 
     private Flow parseString(String path) throws IOException {
@@ -253,6 +253,6 @@ class YamlFlowParserTest {
 
         String input = Files.readString(Path.of(resource.getPath()), Charset.defaultCharset());
 
-        return yamlFlowParser.parse(input, Flow.class);
+        return yamlParser.parse(input, Flow.class);
     }
 }
diff --git a/core/src/test/java/io/kestra/core/services/FlowTopologyServiceTest.java b/core/src/test/java/io/kestra/core/services/FlowTopologyServiceTest.java
index c8f79fdb9..55c9c7b43 100644
--- a/core/src/test/java/io/kestra/core/services/FlowTopologyServiceTest.java
+++ b/core/src/test/java/io/kestra/core/services/FlowTopologyServiceTest.java
@@ -8,7 +8,7 @@ import io.kestra.plugin.core.condition.ExpressionCondition;
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.flows.State;
 import io.kestra.core.models.topologies.FlowRelation;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.plugin.core.debug.Return;
 import io.kestra.plugin.core.flow.Parallel;
 import io.kestra.plugin.core.flow.Subflow;
@@ -33,7 +33,7 @@ class FlowTopologyServiceTest {
     private FlowTopologyService flowTopologyService;
 
     @Inject
-    private YamlFlowParser yamlFlowParser = new YamlFlowParser();
+    private YamlParser yamlParser = new YamlParser();
 
     @Test
     public void flowTask() {
@@ -210,6 +210,6 @@ class FlowTopologyServiceTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class);
+        return yamlParser.parse(file, Flow.class);
     }
 }
\ No newline at end of file
diff --git a/core/src/test/java/io/kestra/core/services/PluginDefaultServiceTest.java b/core/src/test/java/io/kestra/core/services/PluginDefaultServiceTest.java
index b8d301e53..87d04d6d1 100644
--- a/core/src/test/java/io/kestra/core/services/PluginDefaultServiceTest.java
+++ b/core/src/test/java/io/kestra/core/services/PluginDefaultServiceTest.java
@@ -16,14 +16,12 @@ import io.kestra.core.models.triggers.PollingTriggerInterface;
 import io.kestra.core.models.triggers.TriggerContext;
 import io.kestra.core.models.triggers.TriggerOutput;
 import io.kestra.core.runners.RunContext;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.plugin.core.condition.ExpressionCondition;
 import io.kestra.plugin.core.log.Log;
 import io.kestra.plugin.core.trigger.Schedule;
 import jakarta.inject.Inject;
 import lombok.EqualsAndHashCode;
-import io.kestra.core.runners.RunContext;
-import io.kestra.core.junit.annotations.KestraTest;
 import lombok.*;
 import lombok.experimental.SuperBuilder;
 import org.junit.jupiter.api.Assertions;
@@ -58,7 +56,7 @@ class PluginDefaultServiceTest {
     private PluginDefaultService pluginDefaultService;
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Test
     void shouldInjectGivenDefaultsIncludingType() {
@@ -174,7 +172,7 @@ class PluginDefaultServiceTest {
               type: io.kestra.core.services.PluginDefaultServiceTest$DefaultTester
               set: 666""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
@@ -218,7 +216,7 @@ class PluginDefaultServiceTest {
               type: io.kestra.core.services.PluginDefaultServiceTest$DefaultTester
               set: 666""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
@@ -258,7 +256,7 @@ class PluginDefaultServiceTest {
               type: io.kestra.core.services.PluginDefaultServiceTest$DefaultTester
               set: 666""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
@@ -293,7 +291,7 @@ class PluginDefaultServiceTest {
               type: io.kestra.core.services.PluginDefaultServiceTest$DefaultTester
               set: 666""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
@@ -319,7 +317,7 @@ class PluginDefaultServiceTest {
               type: io.kestra.core.services.PluginDefaultServiceTest$DefaultTester
               set: 666""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
@@ -346,7 +344,7 @@ class PluginDefaultServiceTest {
               message: testing
               level: INFO""";
 
-        FlowWithSource flow = yamlFlowParser.parse(source, Flow.class)
+        FlowWithSource flow = yamlParser.parse(source, Flow.class)
             .withSource(source)
             .toBuilder()
             .pluginDefaults(List.of(
diff --git a/core/src/test/java/io/kestra/core/validations/FlowValidationTest.java b/core/src/test/java/io/kestra/core/validations/FlowValidationTest.java
index 3866e67ba..78c70fee0 100644
--- a/core/src/test/java/io/kestra/core/validations/FlowValidationTest.java
+++ b/core/src/test/java/io/kestra/core/validations/FlowValidationTest.java
@@ -2,7 +2,7 @@ package io.kestra.core.validations;
 
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.models.validations.ModelValidator;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.utils.TestsUtils;
 import io.kestra.core.junit.annotations.KestraTest;
 import jakarta.inject.Inject;
@@ -22,7 +22,7 @@ class FlowValidationTest {
     @Inject
     private ModelValidator modelValidator;
     @Inject
-    private YamlFlowParser yamlFlowParser = new YamlFlowParser();
+    private YamlParser yamlParser = new YamlParser();
 
     @Test
     void invalidRecursiveFlow() {
@@ -57,6 +57,6 @@ class FlowValidationTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class);
+        return yamlParser.parse(file, Flow.class);
     }
 }
diff --git a/core/src/test/java/io/kestra/plugin/core/flow/DagTest.java b/core/src/test/java/io/kestra/plugin/core/flow/DagTest.java
index fd9e7acf0..0ed19147a 100644
--- a/core/src/test/java/io/kestra/plugin/core/flow/DagTest.java
+++ b/core/src/test/java/io/kestra/plugin/core/flow/DagTest.java
@@ -6,7 +6,7 @@ import io.kestra.core.models.flows.State;
 import io.kestra.core.models.validations.ModelValidator;
 import io.kestra.core.queues.QueueException;
 import io.kestra.core.runners.AbstractMemoryRunnerTest;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.utils.TestsUtils;
 import jakarta.inject.Inject;
 import org.junit.jupiter.api.Test;
@@ -23,7 +23,7 @@ import static org.hamcrest.Matchers.is;
 
 public class DagTest extends AbstractMemoryRunnerTest {
     @Inject
-    YamlFlowParser yamlFlowParser = new YamlFlowParser();
+    YamlParser yamlParser = new YamlParser();
 
     @Inject
     ModelValidator modelValidator;
@@ -70,6 +70,6 @@ public class DagTest extends AbstractMemoryRunnerTest {
 
         File file = new File(resource.getFile());
 
-        return yamlFlowParser.parse(file, Flow.class);
+        return yamlParser.parse(file, Flow.class);
     }
 }
diff --git a/core/src/test/java/io/kestra/plugin/core/flow/RuntimeLabelsTest.java b/core/src/test/java/io/kestra/plugin/core/flow/RuntimeLabelsTest.java
index 0c7afe3f4..244c4f342 100644
--- a/core/src/test/java/io/kestra/plugin/core/flow/RuntimeLabelsTest.java
+++ b/core/src/test/java/io/kestra/plugin/core/flow/RuntimeLabelsTest.java
@@ -67,4 +67,37 @@ class RuntimeLabelsTest extends AbstractMemoryRunnerTest {
         String labelsTaskRunId = execution.findTaskRunsByTaskId("labels").getFirst().getId();
         assertThat(execution.getLabels(), hasItem(new Label("someLabel", labelsTaskRunId)));
     }
+
+    @Test
+    void primitiveTypeLabels() throws TimeoutException, QueueException {
+        Execution execution = runnerUtils.runOne(
+            null,
+            "io.kestra.tests",
+            "primitive-labels-flow",
+            null,
+            (flow, createdExecution) -> Map.of(
+                "intLabel", 42,
+                "boolLabel", true,
+                "floatLabel", 3.14f
+            ),
+            null,
+            List.of(
+                new Label("existingLabel", "someValue")
+            )
+        );
+
+        assertThat(execution.getTaskRunList().size(), is(1));
+        assertThat(execution.getState().getCurrent(), is(State.Type.SUCCESS));
+
+        String labelsTaskRunId = execution.findTaskRunsByTaskId("update-labels").getFirst().getId();
+
+        assertThat(execution.getLabels(), containsInAnyOrder(
+            is(new Label(Label.CORRELATION_ID, execution.getId())),
+            is(new Label("intValue", "42")),
+            is(new Label("boolValue", "true")),
+            is(new Label("floatValue", "3.14")),
+            is(new Label("taskRunId", labelsTaskRunId)),
+            is(new Label("existingLabel", "someValue"))
+        ));
+    }
 }
diff --git a/core/src/test/resources/flows/valids/primitive-labels-flow.yml b/core/src/test/resources/flows/valids/primitive-labels-flow.yml
new file mode 100644
index 000000000..ced8aea3b
--- /dev/null
+++ b/core/src/test/resources/flows/valids/primitive-labels-flow.yml
@@ -0,0 +1,19 @@
+id: primitive-labels-flow
+namespace: io.kestra.tests
+
+inputs:
+  - name: intLabel
+    type: INT
+  - name: floatLabel
+    type: FLOAT
+  - name: boolLabel
+    type: BOOLEAN
+
+tasks:
+  - id: update-labels
+    type: io.kestra.plugin.core.execution.Labels
+    labels:
+      intValue: "{{inputs.intLabel}}"
+      floatValue: "{{inputs.floatLabel}}"
+      boolValue: "{{inputs.boolLabel}}"
+      taskRunId: "{{taskrun.id}}"
\ No newline at end of file
diff --git a/repository-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java b/repository-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
index 465f686a9..3b1144791 100644
--- a/repository-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
+++ b/repository-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
@@ -2,7 +2,7 @@ package io.kestra.repository.memory;
 
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.repositories.FlowRepositoryInterface;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.junit.annotations.KestraTest;
 import jakarta.inject.Inject;
 import org.junit.jupiter.api.Test;
@@ -14,7 +14,7 @@ import static org.hamcrest.Matchers.is;
 public class MemoryRepositoryTest {
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private FlowRepositoryInterface flowRepositoryInterface;
@@ -30,7 +30,7 @@ public class MemoryRepositoryTest {
               - id: some-task
                 type: io.kestra.core.tasks.debugs.Return
                 format: "Hello, World!\"""";
-        Flow flow = yamlFlowParser.parse(flowSource, Flow.class);
+        Flow flow = yamlParser.parse(flowSource, Flow.class);
         flowRepositoryInterface.create(flow, flowSource, flow);
 
         assertThat(flowRepositoryInterface.findAll(null).size(), is(1));
diff --git a/runner-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java b/runner-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
index 465f686a9..3b1144791 100644
--- a/runner-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
+++ b/runner-memory/src/test/java/io/kestra/repository/memory/MemoryRepositoryTest.java
@@ -2,7 +2,7 @@ package io.kestra.repository.memory;
 
 import io.kestra.core.models.flows.Flow;
 import io.kestra.core.repositories.FlowRepositoryInterface;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.core.junit.annotations.KestraTest;
 import jakarta.inject.Inject;
 import org.junit.jupiter.api.Test;
@@ -14,7 +14,7 @@ import static org.hamcrest.Matchers.is;
 public class MemoryRepositoryTest {
 
     @Inject
-    private YamlFlowParser yamlFlowParser;
+    private YamlParser yamlParser;
 
     @Inject
     private FlowRepositoryInterface flowRepositoryInterface;
@@ -30,7 +30,7 @@ public class MemoryRepositoryTest {
               - id: some-task
                 type: io.kestra.core.tasks.debugs.Return
                 format: "Hello, World!\"""";
-        Flow flow = yamlFlowParser.parse(flowSource, Flow.class);
+        Flow flow = yamlParser.parse(flowSource, Flow.class);
         flowRepositoryInterface.create(flow, flowSource, flow);
 
         assertThat(flowRepositoryInterface.findAll(null).size(), is(1));
diff --git a/webserver/src/test/java/io/kestra/webserver/controllers/api/FlowControllerTest.java b/webserver/src/test/java/io/kestra/webserver/controllers/api/FlowControllerTest.java
index 3c6ada3dc..4cc1ab94d 100644
--- a/webserver/src/test/java/io/kestra/webserver/controllers/api/FlowControllerTest.java
+++ b/webserver/src/test/java/io/kestra/webserver/controllers/api/FlowControllerTest.java
@@ -11,7 +11,7 @@ import io.kestra.core.models.hierarchies.FlowGraph;
 import io.kestra.core.models.tasks.Task;
 import io.kestra.core.models.validations.ValidateConstraintViolation;
 import io.kestra.core.serializers.JacksonMapper;
-import io.kestra.core.serializers.YamlFlowParser;
+import io.kestra.core.serializers.YamlParser;
 import io.kestra.plugin.core.debug.Return;
 import io.kestra.plugin.core.flow.Sequential;
 import io.kestra.core.utils.IdUtils;
@@ -33,7 +33,6 @@ import org.hamcrest.Matchers;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.platform.commons.annotation.Testable;
 
 import java.io.File;
 import java.io.IOException;
@@ -78,7 +77,7 @@ class FlowControllerTest extends JdbcH2ControllerTest {
     @Test
     void id() {
         String result = client.toBlocking().retrieve(HttpRequest.GET("/api/v1/flows/io.kestra.tests/full"), String.class);
-        Flow flow = new YamlFlowParser().parse(result, Flow.class);
+        Flow flow = new YamlParser().parse(result, Flow.class);
         assertThat(flow.getId(), is("full"));
         assertThat(flow.getTasks().size(), is(5));
     }
@@ -315,7 +314,7 @@ class FlowControllerTest extends JdbcH2ControllerTest {
         assertThat(e.getStatus(), is(NOT_FOUND));
 
         String deletedResult = client.toBlocking().retrieve(HttpRequest.GET("/api/v1/flows/" + flow.getNamespace() + "/" + flow.getId() + "?allowDeleted=true"), String.class);
-        Flow deletedFlow = new YamlFlowParser().parse(deletedResult, Flow.class);
+        Flow deletedFlow = new YamlParser().parse(deletedResult, Flow.class);
 
         assertThat(deletedFlow.isDeleted(), is(true));
     }
@@ -926,7 +925,7 @@ class FlowControllerTest extends JdbcH2ControllerTest {
     }
 
     private Flow parseFlow(String flow) {
-        return new YamlFlowParser().parse(flow, Flow.class);
+        return new YamlParser().parse(flow, Flow.class);
     }
 
     private String generateFlowAsString(String friendlyId, String namespace, String format) {