diff --git a/.github/workflows/build-with-release-profile.yml b/.github/workflows/build-with-release-profile.yml index 2eafdcafc..129833307 100644 --- a/.github/workflows/build-with-release-profile.yml +++ b/.github/workflows/build-with-release-profile.yml @@ -6,7 +6,7 @@ name: Build with '-Prelease' on: # Handle all branches for now push: - pull_request: + pull_request_target: workflow_dispatch: # Only run the latest job @@ -47,7 +47,7 @@ jobs: mkdir -p ~/.m2 echo "central-a2asdk-temp${{ secrets.CENTRAL_TOKEN_USERNAME }}${{ secrets.CENTRAL_TOKEN_PASSWORD }}" > ~/.m2/settings.xml - # Deploy to Maven Central + # Build with the same settings as the deploy job # -s uses the settings file we created. - name: Build with same arguments as deploy job run: > diff --git a/.github/workflows/run-tck.yml b/.github/workflows/run-tck.yml index 8dddf8124..375d7f6d3 100644 --- a/.github/workflows/run-tck.yml +++ b/.github/workflows/run-tck.yml @@ -5,14 +5,17 @@ on: push: branches: - main + - 0.3.x pull_request: branches: - main + - 0.3.x workflow_dispatch: env: + # TODO once we have the TCK for 0.4.0 we will need to look at the branch to decide which TCK version to run. # Tag of the TCK - TCK_VERSION: 0.3.0.beta2 + TCK_VERSION: 0.3.0.beta3 # Tells uv to not need a venv, and instead use system UV_SYSTEM_PYTHON: 1 # SUT_JSONRPC_URL to use for the TCK and the server agent diff --git a/client/base/pom.xml b/client/base/pom.xml index 332ddd995..2e9add628 100644 --- a/client/base/pom.xml +++ b/client/base/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-client diff --git a/client/transport/grpc/pom.xml b/client/transport/grpc/pom.xml index ae949cc12..9818ae4f8 100644 --- a/client/transport/grpc/pom.xml +++ b/client/transport/grpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../../pom.xml a2a-java-sdk-client-transport-grpc diff --git a/client/transport/jsonrpc/pom.xml b/client/transport/jsonrpc/pom.xml index 0b8e5c819..4422a4ac3 100644 --- a/client/transport/jsonrpc/pom.xml +++ b/client/transport/jsonrpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../../pom.xml a2a-java-sdk-client-transport-jsonrpc diff --git a/client/transport/rest/pom.xml b/client/transport/rest/pom.xml index 3658a0b45..8b40bad9f 100644 --- a/client/transport/rest/pom.xml +++ b/client/transport/rest/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../../pom.xml a2a-java-sdk-client-transport-rest diff --git a/client/transport/spi/pom.xml b/client/transport/spi/pom.xml index b07d672d4..3c340b70a 100644 --- a/client/transport/spi/pom.xml +++ b/client/transport/spi/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../../pom.xml a2a-java-sdk-client-transport-spi diff --git a/common/pom.xml b/common/pom.xml index 4a762745c..1c5547e9e 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-common diff --git a/examples/cloud-deployment/server/pom.xml b/examples/cloud-deployment/server/pom.xml index 00572ed8d..91bf77eb4 100644 --- a/examples/cloud-deployment/server/pom.xml +++ b/examples/cloud-deployment/server/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../../pom.xml @@ -17,7 +17,7 @@ Example demonstrating A2A agent deployment in Kubernetes with database persistence and event replication - + io.github.a2asdk a2a-java-sdk-reference-jsonrpc @@ -45,14 +45,17 @@ ${project.version} - + io.github.a2asdk a2a-java-queue-manager-replication-mp-reactive ${project.version} - + io.quarkus quarkus-messaging-kafka @@ -70,32 +73,12 @@ quarkus-hibernate-orm - - - io.quarkus - quarkus-resteasy-jackson - - io.quarkus quarkus-smallrye-health - - - jakarta.enterprise - jakarta.enterprise.cdi-api - provided - - - - - org.slf4j - slf4j-api - - - io.github.a2asdk a2a-java-sdk-client diff --git a/examples/helloworld/client/pom.xml b/examples/helloworld/client/pom.xml index 90da6e004..7ef99f7f6 100644 --- a/examples/helloworld/client/pom.xml +++ b/examples/helloworld/client/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-examples-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-examples-client diff --git a/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldRunner.java b/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldRunner.java index 24b0d6159..6a3415371 100644 --- a/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldRunner.java +++ b/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldRunner.java @@ -1,6 +1,6 @@ ///usr/bin/env jbang "$0" "$@" ; exit $? -//DEPS io.github.a2asdk:a2a-java-sdk-client:0.3.0.Final -//DEPS io.github.a2asdk:a2a-java-sdk-client-transport-jsonrpc:0.3.0.Final +//DEPS io.github.a2asdk:a2a-java-sdk-client:0.3.2.Beta1-SNAPSHOT +//DEPS io.github.a2asdk:a2a-java-sdk-client-transport-jsonrpc:0.3.2.Beta1-SNAPSHOT //SOURCES HelloWorldClient.java /** diff --git a/examples/helloworld/pom.xml b/examples/helloworld/pom.xml index 66940a387..35eede3bd 100644 --- a/examples/helloworld/pom.xml +++ b/examples/helloworld/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml diff --git a/examples/helloworld/server/pom.xml b/examples/helloworld/server/pom.xml index 96001f9f4..581fa8b19 100644 --- a/examples/helloworld/server/pom.xml +++ b/examples/helloworld/server/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-examples-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-examples-server diff --git a/extras/common/pom.xml b/extras/common/pom.xml index f69af2bbf..5e2e6212c 100644 --- a/extras/common/pom.xml +++ b/extras/common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml diff --git a/extras/push-notification-config-store-database-jpa/pom.xml b/extras/push-notification-config-store-database-jpa/pom.xml index c8fefc5e4..a4520e963 100644 --- a/extras/push-notification-config-store-database-jpa/pom.xml +++ b/extras/push-notification-config-store-database-jpa/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-extras-push-notification-config-store-database-jpa diff --git a/extras/queue-manager-replicated/core/pom.xml b/extras/queue-manager-replicated/core/pom.xml index 4fc4550b7..ba22098ca 100644 --- a/extras/queue-manager-replicated/core/pom.xml +++ b/extras/queue-manager-replicated/core/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java b/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java index f05201fb7..7e18ca4a8 100644 --- a/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java +++ b/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java @@ -139,7 +139,7 @@ public void testTaskStatusUpdateEventSerialization() throws JsonProcessingExcept public void testTaskArtifactUpdateEventSerialization() throws JsonProcessingException { // Create a TaskArtifactUpdateEvent List> parts = List.of(new TextPart("Test artifact content")); - Artifact artifact = new Artifact("test-artifact-123", "Test Artifact", "Test description", parts, null); + Artifact artifact = new Artifact("test-artifact-123", "Test Artifact", "Test description", parts, null, null); TaskArtifactUpdateEvent originalEvent = new TaskArtifactUpdateEvent.Builder() .taskId("test-task-xyz") .contextId("test-context-uvw") diff --git a/extras/queue-manager-replicated/pom.xml b/extras/queue-manager-replicated/pom.xml index b8c3fef98..af259d689 100644 --- a/extras/queue-manager-replicated/pom.xml +++ b/extras/queue-manager-replicated/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml diff --git a/extras/queue-manager-replicated/replication-mp-reactive/pom.xml b/extras/queue-manager-replicated/replication-mp-reactive/pom.xml index 917ea52f8..cacaaa843 100644 --- a/extras/queue-manager-replicated/replication-mp-reactive/pom.xml +++ b/extras/queue-manager-replicated/replication-mp-reactive/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-multi-instance/pom.xml b/extras/queue-manager-replicated/tests-multi-instance/pom.xml index 9993f83a9..e611e0f88 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/pom.xml +++ b/extras/queue-manager-replicated/tests-multi-instance/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/pom.xml b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/pom.xml index ad1935815..90e288b60 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/pom.xml +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-tests-multi-instance-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/src/main/resources/application.properties b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/src/main/resources/application.properties index f2d484ef3..d0692ca53 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/src/main/resources/application.properties +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-1/src/main/resources/application.properties @@ -1,9 +1,6 @@ # Application HTTP Port quarkus.http.port=8081 -# Select our ReplicatedQueueManager and JpaDatabaseTaskStore as the active implementations -quarkus.arc.selected-alternatives=io.a2a.extras.queuemanager.replicated.core.ReplicatedQueueManager,io.a2a.extras.taskstore.database.jpa.JpaDatabaseTaskStore - # Configure PostgreSQL database (connection details will be provided by Testcontainers) quarkus.datasource."a2a-java".db-kind=postgresql quarkus.datasource."a2a-java".jdbc.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/a2adb} diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/pom.xml b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/pom.xml index a8d6e34e4..70fbf329f 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/pom.xml +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-tests-multi-instance-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/src/main/resources/application.properties b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/src/main/resources/application.properties index ca4698aa2..0b647f3a5 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/src/main/resources/application.properties +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-app-2/src/main/resources/application.properties @@ -1,9 +1,6 @@ # Application HTTP Port quarkus.http.port=8082 -# Select our ReplicatedQueueManager and JpaDatabaseTaskStore as the active implementations -quarkus.arc.selected-alternatives=io.a2a.extras.queuemanager.replicated.core.ReplicatedQueueManager,io.a2a.extras.taskstore.database.jpa.JpaDatabaseTaskStore - # Configure PostgreSQL database (connection details will be provided by Testcontainers) quarkus.datasource."a2a-java".db-kind=postgresql quarkus.datasource."a2a-java".jdbc.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/a2adb} diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/pom.xml b/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/pom.xml index 35ddc799d..cc4a8562d 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/pom.xml +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-tests-multi-instance-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-multi-instance/tests/pom.xml b/extras/queue-manager-replicated/tests-multi-instance/tests/pom.xml index 94d1438bf..51773af02 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/tests/pom.xml +++ b/extras/queue-manager-replicated/tests-multi-instance/tests/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-tests-multi-instance-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-single-instance/pom.xml b/extras/queue-manager-replicated/tests-single-instance/pom.xml index dad8ef5e0..df44234c7 100644 --- a/extras/queue-manager-replicated/tests-single-instance/pom.xml +++ b/extras/queue-manager-replicated/tests-single-instance/pom.xml @@ -6,7 +6,7 @@ io.github.a2asdk a2a-java-queue-manager-replicated-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../pom.xml diff --git a/extras/queue-manager-replicated/tests-single-instance/src/test/resources/application.properties b/extras/queue-manager-replicated/tests-single-instance/src/test/resources/application.properties index 1e02c4559..15aed5bc3 100644 --- a/extras/queue-manager-replicated/tests-single-instance/src/test/resources/application.properties +++ b/extras/queue-manager-replicated/tests-single-instance/src/test/resources/application.properties @@ -1,6 +1,3 @@ -# Select our ReplicatedQueueManager as the active implementation -quarkus.arc.selected-alternatives=io.a2a.extras.queuemanager.replicated.core.ReplicatedQueueManager,io.a2a.extras.taskstore.database.jpa.JpaDatabaseTaskStore - # Configure in-memory H2 database for testing quarkus.datasource."a2a-java".db-kind=h2 quarkus.datasource."a2a-java".jdbc.url=jdbc:h2:mem:test diff --git a/extras/task-store-database-jpa/pom.xml b/extras/task-store-database-jpa/pom.xml index f7b8816a6..319d3d277 100644 --- a/extras/task-store-database-jpa/pom.xml +++ b/extras/task-store-database-jpa/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-extras-task-store-database-jpa diff --git a/http-client/pom.xml b/http-client/pom.xml index 56bc6db24..0a35e7232 100644 --- a/http-client/pom.xml +++ b/http-client/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-http-client diff --git a/pom.xml b/pom.xml index 46d29db66..3221fae82 100644 --- a/pom.xml +++ b/pom.xml @@ -6,8 +6,8 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final - + 0.3.2.Beta1-SNAPSHOT + pom Java SDK A2A Parent diff --git a/reference/common/pom.xml b/reference/common/pom.xml index 9c16f1158..8becda134 100644 --- a/reference/common/pom.xml +++ b/reference/common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-reference-common diff --git a/reference/grpc/pom.xml b/reference/grpc/pom.xml index 0e84ea936..72ac58701 100644 --- a/reference/grpc/pom.xml +++ b/reference/grpc/pom.xml @@ -6,7 +6,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml diff --git a/reference/jsonrpc/pom.xml b/reference/jsonrpc/pom.xml index 9ceb7800f..48a3758d9 100644 --- a/reference/jsonrpc/pom.xml +++ b/reference/jsonrpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-reference-jsonrpc diff --git a/reference/rest/pom.xml b/reference/rest/pom.xml index 3a8416335..ba83bed0e 100644 --- a/reference/rest/pom.xml +++ b/reference/rest/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-reference-rest diff --git a/server-common/pom.xml b/server-common/pom.xml index d48f69036..14ae048c3 100644 --- a/server-common/pom.xml +++ b/server-common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-server-common diff --git a/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java b/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java index 523b9346f..4b1112e22 100644 --- a/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java +++ b/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java @@ -5,7 +5,9 @@ import static io.a2a.util.Utils.appendArtifactToTask; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import io.a2a.spec.A2AServerException; import io.a2a.spec.Artifact; @@ -78,7 +80,9 @@ Task saveTaskEvent(TaskStatusUpdateEvent event) throws A2AServerException { // Handle metadata from the event if (event.getMetadata() != null) { - builder.metadata(event.getMetadata()); + Map metadata = task.getMetadata() == null ? new HashMap<>() : new HashMap<>(task.getMetadata()); + metadata.putAll(event.getMetadata()); + builder.metadata(metadata); } task = builder.build(); @@ -104,12 +108,16 @@ public Event process(Event event) throws A2AServerException { } public Task updateWithMessage(Message message, Task task) { - List history = task.getHistory() == null ? new ArrayList<>() : new ArrayList<>(task.getHistory()); - if (task.getStatus().message() != null) { - history.add(task.getStatus().message()); + List history = new ArrayList<>(task.getHistory()); + + TaskStatus status = task.getStatus(); + if (status.message() != null) { + history.add(status.message()); + status = new TaskStatus(status.state(), null, status.timestamp()); } history.add(message); task = new Task.Builder(task) + .status(status) .history(history) .build(); saveTask(task); diff --git a/server-common/src/main/java/io/a2a/server/util/ArtifactUtils.java b/server-common/src/main/java/io/a2a/server/util/ArtifactUtils.java index 7a8637680..406113fd4 100644 --- a/server-common/src/main/java/io/a2a/server/util/ArtifactUtils.java +++ b/server-common/src/main/java/io/a2a/server/util/ArtifactUtils.java @@ -32,6 +32,7 @@ public static Artifact newArtifact(String name, List> parts, String desc name, description, parts, + null, null ); } diff --git a/server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java b/server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java index d6f0e996e..49e69f99e 100644 --- a/server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java +++ b/server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java @@ -12,6 +12,8 @@ import jakarta.annotation.PreDestroy; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; + import org.eclipse.microprofile.config.inject.ConfigProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,12 +23,15 @@ public class AsyncExecutorProducer { private static final Logger LOGGER = LoggerFactory.getLogger(AsyncExecutorProducer.class); + @Inject // Needed to work in standard Jakarta runtimes (Quarkus skips this) @ConfigProperty(name = "a2a.executor.core-pool-size", defaultValue = "5") int corePoolSize; + @Inject // Needed to work in standard Jakarta runtimes (Quarkus skips this) @ConfigProperty(name = "a2a.executor.max-pool-size", defaultValue = "50") int maxPoolSize; + @Inject // Needed to work in standard Jakarta runtimes (Quarkus skips this) @ConfigProperty(name = "a2a.executor.keep-alive-seconds", defaultValue = "60") long keepAliveSeconds; diff --git a/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java b/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java index 25b5ead11..1a4850bda 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java @@ -588,8 +588,8 @@ public void testSaveTaskEventMetadataUpdateNull() throws A2AServerException { } @Test - public void testSaveTaskEventMetadataUpdateOverwritesExisting() throws A2AServerException { - // Test that metadata update overwrites existing metadata + public void testSaveTaskEventMetadataMergeExisting() throws A2AServerException { + // Test that metadata update merges with existing metadata Map originalMetadata = new HashMap<>(); originalMetadata.put("original_key", "original_value"); @@ -612,8 +612,10 @@ public void testSaveTaskEventMetadataUpdateOverwritesExisting() throws A2AServer taskManager.saveTaskEvent(event); Task updatedTask = taskManager.getTask(); - assertEquals(newMetadata, updatedTask.getMetadata()); - assertNotEquals(originalMetadata, updatedTask.getMetadata()); + + Map mergedMetadata = new HashMap<>(originalMetadata); + mergedMetadata.putAll(newMetadata); + assertEquals(mergedMetadata, updatedTask.getMetadata()); } @Test @@ -692,4 +694,48 @@ public void testSaveTaskInternal() throws A2AServerException { assertEquals("test-context", taskManagerWithoutId.getContextId()); assertSame(savedTask, taskManagerWithoutId.getTask()); } + + @Test + public void testUpdateWithMessage() throws A2AServerException { + Message initialMessage = new Message.Builder() + .role(Message.Role.USER) + .parts(Collections.singletonList(new TextPart("initial message"))) + .messageId("initial-msg-id") + .build(); + + TaskManager taskManagerWithInitialMessage = new TaskManager(null, null, taskStore, initialMessage); + + Message taskMessage = new Message.Builder() + .role(Message.Role.AGENT) + .parts(Collections.singletonList(new TextPart("task message"))) + .messageId("task-msg-id") + .build(); + + TaskStatusUpdateEvent event = new TaskStatusUpdateEvent.Builder() + .taskId("new-task-id") + .contextId("some-context") + .status(new TaskStatus(TaskState.SUBMITTED, taskMessage, null)) + .isFinal(false) + .build(); + + Task saved = taskManagerWithInitialMessage.saveTaskEvent(event); + + Message updateMessage = new Message.Builder() + .role(Message.Role.USER) + .parts(Collections.singletonList(new TextPart("update message"))) + .messageId("update-msg-id") + .build(); + + Task updated = taskManagerWithInitialMessage.updateWithMessage(updateMessage, saved); + + // There should now be a history containing the initialMessage, task message and update message + assertNotNull(updated.getHistory()); + assertEquals(3, updated.getHistory().size()); + assertEquals("initial message", ((TextPart) updated.getHistory().get(0).getParts().get(0)).getText()); + + // The message in the current state should be null + assertNull(updated.getStatus().message()); + assertEquals("task message", ((TextPart) updated.getHistory().get(1).getParts().get(0)).getText()); + assertEquals("update message", ((TextPart) updated.getHistory().get(2).getParts().get(0)).getText()); + } } diff --git a/spec-grpc/pom.xml b/spec-grpc/pom.xml index e7805eb4f..159fef48c 100644 --- a/spec-grpc/pom.xml +++ b/spec-grpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-spec-grpc diff --git a/spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java b/spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java index 701947b42..357016054 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java @@ -875,7 +875,8 @@ public static Message message(io.a2a.grpc.MessageOrBuilder message) { message.getContextId().isEmpty() ? null : message.getContextId(), message.getTaskId().isEmpty() ? null : message.getTaskId(), null, // referenceTaskIds is not in grpc message - struct(message.getMetadata()) + struct(message.getMetadata()), + message.getExtensionsList().isEmpty() ? null : message.getExtensionsList() ); } @@ -906,7 +907,8 @@ private static Artifact artifact(io.a2a.grpc.ArtifactOrBuilder artifact) { artifact.getName(), artifact.getDescription(), artifact.getPartsList().stream().map(item -> part(item)).collect(Collectors.toList()), - struct(artifact.getMetadata()) + struct(artifact.getMetadata()), + artifact.getExtensionsList().isEmpty() ? null : artifact.getExtensionsList() ); } diff --git a/spec/pom.xml b/spec/pom.xml index afe9f76bb..e1351828b 100644 --- a/spec/pom.xml +++ b/spec/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-java-sdk-spec diff --git a/spec/src/main/java/io/a2a/spec/Artifact.java b/spec/src/main/java/io/a2a/spec/Artifact.java index cb4d1504b..798ac5823 100644 --- a/spec/src/main/java/io/a2a/spec/Artifact.java +++ b/spec/src/main/java/io/a2a/spec/Artifact.java @@ -12,7 +12,8 @@ */ @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonIgnoreProperties(ignoreUnknown = true) -public record Artifact(String artifactId, String name, String description, List> parts, Map metadata) { +public record Artifact(String artifactId, String name, String description, List> parts, Map metadata, + List extensions) { public Artifact { Assert.checkNotNullParam("artifactId", artifactId); @@ -28,6 +29,7 @@ public static class Builder { private String description; private List> parts; private Map metadata; + private List extensions; public Builder(){ } @@ -38,6 +40,7 @@ public Builder(Artifact existingArtifact) { description = existingArtifact.description; parts = existingArtifact.parts; metadata = existingArtifact.metadata; + extensions = existingArtifact.extensions; } public Builder artifactId(String artifactId) { @@ -71,8 +74,13 @@ public Builder metadata(Map metadata) { return this; } + public Builder extensions(List extensions) { + this.extensions = (extensions == null) ? null : List.copyOf(extensions); + return this; + } + public Artifact build() { - return new Artifact(artifactId, name, description, parts, metadata); + return new Artifact(artifactId, name, description, parts, metadata, extensions); } } } diff --git a/spec/src/main/java/io/a2a/spec/Message.java b/spec/src/main/java/io/a2a/spec/Message.java index 8278bec7e..dd7e860a5 100644 --- a/spec/src/main/java/io/a2a/spec/Message.java +++ b/spec/src/main/java/io/a2a/spec/Message.java @@ -34,17 +34,18 @@ public final class Message implements EventKind, StreamingEventKind { private final Map metadata; private final String kind; private final List referenceTaskIds; + private final List extensions; public Message(Role role, List> parts, String messageId, String contextId, String taskId, - List referenceTaskIds, Map metadata) { - this(role, parts, messageId, contextId, taskId, referenceTaskIds, metadata, MESSAGE); + List referenceTaskIds, Map metadata, List extensions) { + this(role, parts, messageId, contextId, taskId, referenceTaskIds, metadata, extensions, MESSAGE); } @JsonCreator public Message(@JsonProperty("role") Role role, @JsonProperty("parts") List> parts, @JsonProperty("messageId") String messageId, @JsonProperty("contextId") String contextId, @JsonProperty("taskId") String taskId, @JsonProperty("referenceTaskIds") List referenceTaskIds, - @JsonProperty("metadata") Map metadata, + @JsonProperty("metadata") Map metadata, @JsonProperty("extensions") List extensions, @JsonProperty("kind") String kind) { Assert.checkNotNullParam("kind", kind); Assert.checkNotNullParam("parts", parts); @@ -63,6 +64,7 @@ public Message(@JsonProperty("role") Role role, @JsonProperty("parts") List getReferenceTaskIds() { return referenceTaskIds; } + public List getExtensions() { + return extensions; + } + @Override public String getKind() { return kind; @@ -132,6 +138,7 @@ public static class Builder { private String taskId; private List referenceTaskIds; private Map metadata; + private List extensions; public Builder() { } @@ -144,6 +151,7 @@ public Builder(Message message) { taskId = message.taskId; referenceTaskIds = message.referenceTaskIds; metadata = message.metadata; + extensions = message.extensions; } public Builder role(Role role) { @@ -186,9 +194,14 @@ public Builder metadata(Map metadata) { return this; } + public Builder extensions(List extensions) { + this.extensions = (extensions == null) ? null : List.copyOf(extensions); + return this; + } + public Message build() { return new Message(role, parts, messageId == null ? UUID.randomUUID().toString() : messageId, - contextId, taskId, referenceTaskIds, metadata); + contextId, taskId, referenceTaskIds, metadata, extensions); } } } diff --git a/tck/pom.xml b/tck/pom.xml index de276a2bc..1bb66da05 100644 --- a/tck/pom.xml +++ b/tck/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT a2a-tck-server diff --git a/tests/server-common/pom.xml b/tests/server-common/pom.xml index ac01d5aff..399aa32ce 100644 --- a/tests/server-common/pom.xml +++ b/tests/server-common/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-tests-server-common diff --git a/transport/grpc/pom.xml b/transport/grpc/pom.xml index 4f428d1ff..1f227c2fa 100644 --- a/transport/grpc/pom.xml +++ b/transport/grpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-transport-grpc diff --git a/transport/jsonrpc/pom.xml b/transport/jsonrpc/pom.xml index 0b4bd027b..5bf75365b 100644 --- a/transport/jsonrpc/pom.xml +++ b/transport/jsonrpc/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-transport-jsonrpc diff --git a/transport/rest/pom.xml b/transport/rest/pom.xml index 7dc589343..e9d56ccb8 100644 --- a/transport/rest/pom.xml +++ b/transport/rest/pom.xml @@ -7,7 +7,7 @@ io.github.a2asdk a2a-java-sdk-parent - 0.3.0.Final + 0.3.2.Beta1-SNAPSHOT ../../pom.xml a2a-java-sdk-transport-rest