Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
e3e436a
ci: update TCK workflow to use a2a-tck 1.0-dev branch with codegen SU…
jmesnil Apr 16, 2026
cc27228
fix: Fixing last TCK issues (#795)
ehsavoie Apr 16, 2026
ef0d713
chore: release 1.0.0.Beta1
ehsavoie Apr 17, 2026
6b6cb4e
chore: fixing setup-java version (#803)
ehsavoie Apr 17, 2026
66fefdb
chore: Next SNAPSHOT version
ehsavoie Apr 17, 2026
1433850
Set up folder/pom structure of compat module
kabir Apr 10, 2026
62063a5
Wire in the new poms
kabir Apr 10, 2026
93fe17e
Update POM names to include 'Compat 0.3'
kabir Apr 10, 2026
fb471a2
Port spec and spec-grpc packages
kabir Apr 10, 2026
402c006
Add compat client modules
kabir Apr 10, 2026
ef20178
Add the transport/* modules
kabir Apr 10, 2026
543493b
feat(compat-0.3): implement reference server endpoints and transport …
kabir Apr 13, 2026
2ec2497
Implement rest handlers
kabir Apr 13, 2026
c495f56
Port Jackson to Gson/Protobuf migration
kabir Apr 13, 2026
7cffa55
Fix Javadoc errors
kabir Apr 13, 2026
c5dfab0
Enable the compat-0.3/tck module
kabir Apr 13, 2026
64da996
Add compat-0.3/server-conversion module
kabir Apr 13, 2026
2729f60
Add core 0.3-1.0 mappers
kabir Apr 13, 2026
78b6253
Add more complex mappers
kabir Apr 13, 2026
f26f637
Test Task conversion
kabir Apr 13, 2026
ee4ff6f
Add more mappers
kabir Apr 13, 2026
2761030
Implement the converting requesthandler
kabir Apr 13, 2026
f70fb49
Wire converting request handler into JSONRPCHandler
kabir Apr 13, 2026
d1eff85
Wire converting request handler into RestHandler
kabir Apr 13, 2026
97da951
Wire converting request handler into GrpcHandler
kabir Apr 13, 2026
aa886b8
Add compat-0.3 AbstractA2ARequestHandlerTest
kabir Apr 13, 2026
02417ad
Get core JSONRPCHandlerTest tests working
kabir Apr 13, 2026
8057202
Get core RestHandlerTest tests working
kabir Apr 13, 2026
04c2624
Get core GrpcHandlerTest tests working
kabir Apr 13, 2026
0052fd7
Centralise error conversion
kabir Apr 14, 2026
25597bc
Port GrpcErrorMapperTest from 1.0
kabir Apr 14, 2026
3497425
Port JSONRPC streaming and pushnotificaationconfig tests
kabir Apr 14, 2026
17a7fc9
Port REST streaming and pushnotificaationconfig tests
kabir Apr 14, 2026
e55b797
Port gRPC transport and pushnotificaationconfig tests
kabir Apr 14, 2026
c6ad40f
Cleanup
kabir Apr 14, 2026
f228015
Review fixes
kabir Apr 14, 2026
b267b4d
Fix Javadoc
kabir Apr 14, 2026
a1ff4b4
feat: Add v0.3 client dependencies to server-conversion module
kabir Apr 14, 2026
f40b835
feat: Port AgentExecutorProducer with EventQueue to AgentEmitter conv…
kabir Apr 14, 2026
7fdc0b1
fix: Use throw instead of fail() for error handling consistency
kabir Apr 14, 2026
3d7dec7
feat: port AbstractCompat03ServerTest with all integration tests
kabir Apr 14, 2026
a72470e
fix: Add missing test dependencies and fix JsonProcessingException im…
kabir Apr 14, 2026
35dd31a
fix: Convert PushNotificationConfig v0.3 to v1.0 in savePushNotificat…
kabir Apr 14, 2026
d58006f
fix: Use v1.0 JsonUtil for push notification config serialization
kabir Apr 14, 2026
39b7ef7
feat: Add server-conversion test-jar dependency to jsonrpc reference …
kabir Apr 14, 2026
2f999a6
feat: port A2ATestRoutes to expose v1.0 TestUtilsBean via REST endpoints
kabir Apr 14, 2026
0192f59
feat: Enable QuarkusA2AJSONRPCTest and add client dependencies
kabir Apr 14, 2026
53a4fb9
fix: Add CDI bean discovery configuration for compat-0.3 modules
kabir Apr 14, 2026
e1a65cf
fix(compat-0.3): Fix CDI bean discovery for JSONRPC reference server …
kabir Apr 14, 2026
663fc88
fix(compat-0.3): Enable push notifications capability in test AgentCard
kabir Apr 14, 2026
0867cb0
fix(compat-0.3): Add JVM args to open java.lang for Gson reflection
kabir Apr 14, 2026
68f5e67
fix(compat-0.3): Handle initial task snapshot in resubscription tests
kabir Apr 14, 2026
283edea
feat(compat-0.3): Port REST reference server tests
kabir Apr 15, 2026
dfb1e4a
fix(compat-0.3): Use taskId as default configId in REST getTaskPushNo…
kabir Apr 15, 2026
0b476fb
test(compat-0.3): Add testMethodNotFound to REST reference server tests
kabir Apr 15, 2026
2fa3e86
feat(compat-0.3): Port gRPC reference server tests
kabir Apr 15, 2026
f2a8aaf
chore(compat-0.3): Remove placeholder A2AServerRoutesTest stubs
kabir Apr 15, 2026
dffcef8
docs(compat-0.3): Remove TODOs about initial task snapshot validity
kabir Apr 15, 2026
d5de568
refactor(compat-0.3): Unify test infrastructure in server-conversion …
kabir Apr 15, 2026
bd9df4b
fix(compat-0.3): Remove JVM args workaround for Gson reflection
kabir Apr 15, 2026
2636e82
Adapt tests so we work now that PR 788 has been merged
kabir Apr 16, 2026
4b7ea3d
Add _v0_3 suffix
kabir Apr 16, 2026
be107e0
Port fixes for GSON serialisation to pass the TCK
kabir Apr 16, 2026
4a7e038
Add applicaton.properties for TCK
kabir Apr 16, 2026
2326b90
Add PRD
kabir Apr 16, 2026
7de3bb0
TCK fixes
kabir Apr 17, 2026
e088349
TCK failures
kabir Apr 17, 2026
bc1b7a2
Fix A2AServerRoutes_v0_3
kabir Apr 20, 2026
aeab8d8
Leanient validation for 0.3 compat to pass TCK test
kabir Apr 20, 2026
2c0ac9c
Bump version
kabir Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
544 changes: 544 additions & 0 deletions .claude/architecture/compatibility_0.3.md

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions .github/workflows/release-to-maven-central.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
tags:
- 'v?[0-9]+.[0-9]+.[0-9]+*' # Trigger on tags like v1.0.0, 1.2.3, v1.2.3.Alpha1 etc.

jobs:
publish:
# Only run this job for the main repository, not for forks
Expand All @@ -18,15 +17,15 @@ jobs:
uses: actions/checkout@v6

- name: Set up JDK 17
uses: actions/setup-java@v6
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
cache: maven

# Use secrets to import GPG key
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v6
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_SIGNING_KEY }}
passphrase: ${{ secrets.GPG_SIGNING_PASSPHRASE }}
Expand Down
140 changes: 46 additions & 94 deletions .github/workflows/run-tck.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
name: Run TCK

on:
# Handle all branches for now
push:
branches:
- main
Expand All @@ -12,17 +11,10 @@ on:

env:
# Tag/branch of the TCK
TCK_VERSION: main
# Tell the TCK runner to report failure if the quality tests fail
A2A_TCK_FAIL_ON_QUALITY: 1
# Tell the TCK runner to report failure if the features tests fail
A2A_TCK_FAIL_ON_FEATURES: 1
TCK_VERSION: 1.0-dev
# 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
SUT_JSONRPC_URL: http://localhost:9999
# Slow system on CI
TCK_STREAMING_TIMEOUT: 5.0
SUT_URL: http://localhost:9999

# Only run the latest job
concurrency:
Expand All @@ -34,142 +26,102 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [17, 21, 25]
java-version: [17]
steps:
- name: Checkout a2a-java
uses: actions/checkout@v6
- name: Checkout a2a-tck
uses: actions/checkout@v6
with:
repository: a2aproject/a2a-tck
path: tck/a2a-tck
ref: ${{ env.TCK_VERSION }}
- name: Set up JDK ${{ matrix.java-version }}
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.java-version }}
distribution: 'temurin'
cache: maven
- name: check java_home
run: echo $JAVA_HOME
- name: Build a2a-java SDK
run: mvn -B install -DskipTests
- name: Extract a2a-java version
id: extract-version
run: |
A2A_JAVA_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
echo "version=$A2A_JAVA_VERSION" >> $GITHUB_OUTPUT
echo "Detected a2a-java version: $A2A_JAVA_VERSION"
- name: Checkout a2a-tck
uses: actions/checkout@v6
with:
repository: a2aproject/a2a-tck
path: a2a-tck
ref: ${{ env.TCK_VERSION }}
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version-file: "tck/a2a-tck/pyproject.toml"
python-version-file: "a2a-tck/pyproject.toml"
- name: Install uv and Python dependencies
run: |
pip install uv
uv pip install -e .
working-directory: tck/a2a-tck
- name: Build with Maven, skipping tests
run: mvn -B install -DskipTests
working-directory: a2a-tck
- name: Generate a2a-java SUT
run: A2A_JAVA_SDK_VERSION=${{ steps.extract-version.outputs.version }} make codegen-a2a-java-sut
working-directory: a2a-tck
- name: Start SUT
run: SUT_GRPC_URL=${{ env.SUT_JSONRPC_URL }} SUT_REST_URL=${{ env.SUT_JSONRPC_URL }} mvn -B quarkus:dev & #SUT_JSONRPC_URL already set
working-directory: tck
run: mvn -B quarkus:dev -Dquarkus.console.enabled=false &
working-directory: a2a-tck/sut/a2a-java
- name: Wait for SUT to start
run: |
URL="${{ env.SUT_JSONRPC_URL }}/.well-known/agent-card.json"
URL="${{ env.SUT_URL }}/.well-known/agent-card.json"
EXPECTED_STATUS=200
TIMEOUT=120
RETRY_INTERVAL=2
START_TIME=$(date +%s)

while true; do
# Calculate elapsed time
CURRENT_TIME=$(date +%s)
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))

# Check for timeout
if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then
echo "Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
echo "Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
exit 1
fi

# Get HTTP status code. || true is to reporting a failure to connect as an error
HTTP_STATUS=$(curl --output /dev/null --silent --write-out "%{http_code}" "$URL") || true
echo "STATUS: ${HTTP_STATUS}"

# Check if we got the correct status code
if [ "$HTTP_STATUS" -eq "$EXPECTED_STATUS" ]; then
echo "Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
echo "Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
break;
fi

# Wait before retrying
echo "⏳ Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
echo "Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
sleep "$RETRY_INTERVAL"
done

- name: Run TCK
id: run-tck
timeout-minutes: 5
run: |
set -o pipefail
./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category all --transports jsonrpc,grpc,rest --compliance-report report.json 2>&1 | tee tck-output.log
working-directory: tck/a2a-tck
- name: Capture Diagnostics on Failure
if: failure()
uv run ./run_tck.py --sut-host ${{ env.SUT_URL }} -v 2>&1 | tee tck-output.log
working-directory: a2a-tck
- name: TCK Summary
if: always() && steps.run-tck.outcome != 'skipped'
run: |
echo "=== Capturing diagnostic information ==="

# Create diagnostics directory
mkdir -p tck/target/diagnostics

# Capture process list
echo "📋 Capturing process list..."
ps auxww > tck/target/diagnostics/processes.txt

# Find the actual Quarkus JVM (child of Maven process), not the Maven parent
# Look for the dev.jar process which is the actual application
QUARKUS_PID=$(pgrep -f "a2a-tck-server-dev.jar" || echo "")
if [ -n "$QUARKUS_PID" ]; then
echo "📊 Capturing thread dump for Quarkus JVM PID $QUARKUS_PID"
jstack $QUARKUS_PID > tck/target/diagnostics/thread-dump.txt || echo "Failed to capture thread dump"
if [ -f tck/target/diagnostics/thread-dump.txt ]; then
echo "✅ Thread dump captured ($(wc -l < tck/target/diagnostics/thread-dump.txt) lines)"
if [ -f a2a-tck/tck-output.log ]; then
# Extract everything after the first ═══ separator line
SUMMARY=$(sed -n '/^═══/,$p' a2a-tck/tck-output.log)
if [ -n "$SUMMARY" ]; then
echo '### TCK Results (Java ${{ matrix.java-version }})' >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
echo "$SUMMARY" >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
fi
else
echo "⚠️ No Quarkus JVM process found for thread dump"
echo "Available Java processes:"
ps aux | grep java | tee -a tck/target/diagnostics/processes.txt || true
fi

# Capture Quarkus application logs (if available)
echo "📝 Checking for Quarkus logs..."
if [ -f tck/target/quarkus.log ]; then
cp tck/target/quarkus.log tck/target/diagnostics/
echo "✅ Copied quarkus.log ($(wc -l < tck/target/quarkus.log) lines)"
fi

# Copy TCK server logs
if [ -f tck/target/tck-test.log ]; then
cp tck/target/tck-test.log tck/target/diagnostics/
echo "✅ Copied tck-test.log ($(wc -l < tck/target/tck-test.log) lines)"
fi

echo ""
echo "=== Diagnostic capture complete ==="
- name: Stop Quarkus Server
- name: Stop SUT
if: always()
run: |
# Find and kill the Quarkus process to ensure logs are flushed
pkill -f "quarkus:dev" || true
sleep 2
- name: Upload TCK Diagnostics
if: failure()
uses: actions/upload-artifact@v6
with:
name: tck-diagnostics-java-${{ matrix.java-version }}
path: |
tck/target/diagnostics/
tck/a2a-tck/tck-output.log
retention-days: 7
if-no-files-found: warn
- name: Upload TCK Compliance Report
- name: Upload TCK Reports
if: always()
uses: actions/upload-artifact@v6
with:
name: tck-compliance-report-java-${{ matrix.java-version }}
path: tck/a2a-tck/report.json
name: tck-reports-java-${{ matrix.java-version }}
path: a2a-tck/reports/
retention-days: 14
if-no-files-found: ignore
if-no-files-found: warn
2 changes: 1 addition & 1 deletion boms/extras/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>org.a2aproject.sdk</groupId>
<artifactId>a2a-java-sdk-parent</artifactId>
<version>1.0.0.Beta1-SNAPSHOT</version>
<version>1.0.0.Beta2-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class ExtrasBomVerifier extends DynamicBomVerifier {
"tck/", // TCK test suite
"tests/", // Integration tests
"test-utils-docker/", // Test utilities for Docker-based tests
"compat-0.3/", // Compat 0.3 modules (part of SDK BOM, not extras BOM)
"extras/queue-manager-replicated/tests-multi-instance/", // Test harness applications
"extras/queue-manager-replicated/tests-single-instance/", // Test harness applications
"extras/opentelemetry/integration-tests/" // Test harness applications
Expand Down
2 changes: 1 addition & 1 deletion boms/reference/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>org.a2aproject.sdk</groupId>
<artifactId>a2a-java-sdk-parent</artifactId>
<version>1.0.0.Beta1-SNAPSHOT</version>
<version>1.0.0.Beta2-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public class ReferenceBomVerifier extends DynamicBomVerifier {
"examples/", // Example applications
"tck/", // TCK test suite
"tests/", // Integration tests
"test-utils-docker/" // Test utilities for Docker-based tests
"test-utils-docker/", // Test utilities for Docker-based tests
"compat-0.3/" // Compat 0.3 modules (part of SDK BOM, not reference BOM)
// Note: reference/ is NOT in this list - we want to verify those classes load
);

Expand Down
82 changes: 81 additions & 1 deletion boms/sdk/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<parent>
<groupId>org.a2aproject.sdk</groupId>
<artifactId>a2a-java-sdk-parent</artifactId>
<version>1.0.0.Beta1-SNAPSHOT</version>
<version>1.0.0.Beta2-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down Expand Up @@ -108,6 +108,86 @@
<version>${project.version}</version>
</dependency>

<!-- Compat 0.3 Spec modules -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-spec</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-spec-grpc</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Compat 0.3 HTTP Client -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-http-client</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Compat 0.3 Client modules -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-client</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-client-transport-spi</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-client-transport-jsonrpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-client-transport-grpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-client-transport-rest</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Compat 0.3 Transport modules -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-transport-jsonrpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-transport-grpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-transport-rest</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Compat 0.3 Reference modules -->
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-reference-jsonrpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-reference-grpc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>a2a-java-sdk-compat-0.3-reference-rest</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Test utilities -->
<dependency>
<groupId>${project.groupId}</groupId>
Expand Down
Loading
Loading