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/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/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/src/main/java/io/a2a/spec/Artifact.java b/spec/src/main/java/io/a2a/spec/Artifact.java index cb4d1504b..87a48cee4 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 = 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); } } }