Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ synchronized Task saveTaskEvent(TaskStatusUpdateEvent taskStatusUpdateEvent) thr
Task task = currentTask;
if (task == null) {
task = Task.builder()
.status(new TaskStatus(TaskState.UNRECOGNIZED))
.status(new TaskStatus(TaskState.TASK_STATE_UNSPECIFIED))
.id(taskId)
.contextId(contextId == null ? "" : contextId)
.build();
Expand Down Expand Up @@ -96,7 +96,7 @@ synchronized Task saveTaskEvent(TaskArtifactUpdateEvent taskArtifactUpdateEvent)
Task task = currentTask;
if (task == null) {
task = Task.builder()
.status(new TaskStatus(TaskState.UNRECOGNIZED))
.status(new TaskStatus(TaskState.TASK_STATE_UNSPECIFIED))
.id(taskId)
.contextId(contextId == null ? "" : contextId)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@
* <li>v1.0: {@code TASK_STATE_SUBMITTED, TASK_STATE_WORKING, ...}</li>
* </ul>
* <p>
* Additionally, the {@code UNKNOWN} state in v0.3 maps to {@code UNRECOGNIZED} in v1.0.
* Additionally, the {@code UNKNOWN} state in v0.3 maps to {@code TASK_STATE_UNSPECIFIED} in v1.0.
* <p>
* This mapper uses manual switch statements instead of {@code @ValueMapping} to:
* <ul>
* <li>Avoid mapstruct-spi-protobuf enum strategy initialization issues</li>
* <li>Handle explicit null mapping (null → UNRECOGNIZED/UNKNOWN)</li>
* <li>Handle explicit null mapping (null → TASK_STATE_UNSPECIFIED/UNKNOWN)</li>
* <li>Provide clear, compile-time-safe enum conversions</li>
* </ul>
*
Expand Down Expand Up @@ -50,16 +50,16 @@ public interface TaskStateMapper_v0_3 {
* CANCELED → TASK_STATE_CANCELED
* FAILED → TASK_STATE_FAILED
* REJECTED → TASK_STATE_REJECTED
* UNKNOWN → UNRECOGNIZED
* null → UNRECOGNIZED
* UNKNOWN → TASK_STATE_UNSPECIFIED
* null → TASK_STATE_UNSPECIFIED
* </pre>
*
* @param v03 the v0.3 task state (may be null)
* @return the equivalent v1.0 task state (never null)
*/
default TaskState toV10(TaskState_v0_3 v03) {
if (v03 == null) {
return TaskState.UNRECOGNIZED;
return TaskState.TASK_STATE_UNSPECIFIED;
Comment thread
kabir marked this conversation as resolved.
}
return switch (v03) {
case SUBMITTED -> TaskState.TASK_STATE_SUBMITTED;
Expand All @@ -70,7 +70,7 @@ default TaskState toV10(TaskState_v0_3 v03) {
case CANCELED -> TaskState.TASK_STATE_CANCELED;
case FAILED -> TaskState.TASK_STATE_FAILED;
case REJECTED -> TaskState.TASK_STATE_REJECTED;
case UNKNOWN -> TaskState.UNRECOGNIZED;
case UNKNOWN -> TaskState.TASK_STATE_UNSPECIFIED;
};
}

Expand All @@ -89,7 +89,7 @@ default TaskState toV10(TaskState_v0_3 v03) {
* TASK_STATE_CANCELED → CANCELED
* TASK_STATE_FAILED → FAILED
* TASK_STATE_REJECTED → REJECTED
* UNRECOGNIZED → UNKNOWN
* TASK_STATE_UNSPECIFIED → UNKNOWN
* null → UNKNOWN
* </pre>
*
Expand All @@ -109,7 +109,7 @@ default TaskState_v0_3 fromV10(TaskState v10) {
case TASK_STATE_CANCELED -> TaskState_v0_3.CANCELED;
case TASK_STATE_FAILED -> TaskState_v0_3.FAILED;
case TASK_STATE_REJECTED -> TaskState_v0_3.REJECTED;
case UNRECOGNIZED -> TaskState_v0_3.UNKNOWN;
case TASK_STATE_UNSPECIFIED -> TaskState_v0_3.UNKNOWN;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ default org.a2aproject.sdk.spec.TaskState taskStateOrNull(org.a2aproject.sdk.grp
// Reject invalid enum values (e.g., "INVALID_STATUS" from JSON)
if (state == org.a2aproject.sdk.grpc.TaskState.UNRECOGNIZED) {
String validStates = java.util.Arrays.stream(org.a2aproject.sdk.spec.TaskState.values())
.filter(s -> s != org.a2aproject.sdk.spec.TaskState.UNRECOGNIZED)
.filter(s -> s != org.a2aproject.sdk.spec.TaskState.TASK_STATE_UNSPECIFIED)
.map(Enum::name)
.collect(java.util.stream.Collectors.joining(", "));
throw new InvalidParamsError(null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,19 @@ default org.a2aproject.sdk.grpc.TaskState toProto(org.a2aproject.sdk.spec.TaskSt
case TASK_STATE_CANCELED -> org.a2aproject.sdk.grpc.TaskState.TASK_STATE_CANCELED;
case TASK_STATE_FAILED -> org.a2aproject.sdk.grpc.TaskState.TASK_STATE_FAILED;
case TASK_STATE_REJECTED -> org.a2aproject.sdk.grpc.TaskState.TASK_STATE_REJECTED;
case UNRECOGNIZED -> org.a2aproject.sdk.grpc.TaskState.UNRECOGNIZED;
case TASK_STATE_UNSPECIFIED -> org.a2aproject.sdk.grpc.TaskState.TASK_STATE_UNSPECIFIED;
};
}

/**
* Converts proto TaskState to domain TaskState.
*
* @param proto the proto task state
* @return the domain task state, or UNKNOWN if input is null or unrecognized
* @return the domain task state, or TASK_STATE_UNSPECIFIED if input is null or unrecognized
*/
default org.a2aproject.sdk.spec.TaskState fromProto(org.a2aproject.sdk.grpc.TaskState proto) {
if (proto == null) {
return org.a2aproject.sdk.spec.TaskState.UNRECOGNIZED;
return org.a2aproject.sdk.spec.TaskState.TASK_STATE_UNSPECIFIED;
Comment thread
kabir marked this conversation as resolved.
}

return switch (proto) {
Expand All @@ -62,7 +62,7 @@ default org.a2aproject.sdk.spec.TaskState fromProto(org.a2aproject.sdk.grpc.Task
case TASK_STATE_CANCELED -> org.a2aproject.sdk.spec.TaskState.TASK_STATE_CANCELED;
case TASK_STATE_FAILED -> org.a2aproject.sdk.spec.TaskState.TASK_STATE_FAILED;
case TASK_STATE_REJECTED -> org.a2aproject.sdk.spec.TaskState.TASK_STATE_REJECTED;
case TASK_STATE_UNSPECIFIED, UNRECOGNIZED -> org.a2aproject.sdk.spec.TaskState.UNRECOGNIZED;
case TASK_STATE_UNSPECIFIED, UNRECOGNIZED -> org.a2aproject.sdk.spec.TaskState.TASK_STATE_UNSPECIFIED;
};
}
}
6 changes: 3 additions & 3 deletions spec/src/main/java/org/a2aproject/sdk/spec/TaskState.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
* <li><b>TASK_STATE_CANCELED:</b> Task was explicitly canceled by the user or system</li>
* <li><b>TASK_STATE_FAILED:</b> Task failed due to an error during execution</li>
* <li><b>TASK_STATE_REJECTED:</b> Task was rejected by the agent (e.g., invalid request, policy violation)</li>
* <li><b>UNRECOGNIZED:</b> Task state cannot be determined (error recovery state)</li>
* <li><b>TASK_STATE_UNSPECIFIED:</b> Task state cannot be determined (error recovery state)</li>
* </ul>
* <p>
* The {@link #isFinal()} method can be used to determine if a state is terminal, which is
Expand Down Expand Up @@ -64,7 +64,7 @@ public enum TaskState {
TASK_STATE_REJECTED(true, false),

/** Task state is unknown or cannot be determined (terminal state). */
UNRECOGNIZED(true, false);
TASK_STATE_UNSPECIFIED(false, false);

private final boolean isFinal;
private final boolean isInterrupted;
Expand All @@ -81,7 +81,7 @@ public enum TaskState {
* not transition to any other state. This is used by the event queue system
* to determine when to close queues and by clients to know when to stop polling.
* <p>
* Terminal states: COMPLETED, FAILED, CANCELED, REJECTED, UNRECOGNIZED.
* Terminal states: TASK_STATE_COMPLETED, TASK_STATE_FAILED, TASK_STATE_CANCELED, TASK_STATE_REJECTED, TASK_STATE_UNSPECIFIED.
*
* @return {@code true} if this is a terminal state, {@code false} else.
*/
Expand Down
Loading