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