diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 549bbb1..a984c0a 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -7,6 +7,8 @@ on: pull_request: branches: - main + workflow_dispatch: + # Only run the latest job concurrency: diff --git a/.github/workflows/run-tck.yml b/.github/workflows/run-tck.yml index b60a8ad..807970f 100644 --- a/.github/workflows/run-tck.yml +++ b/.github/workflows/run-tck.yml @@ -2,12 +2,8 @@ name: Build and Run TCK on: push: - branches: -# - main pull_request: - branches: -# - main - + workflow_dispatch: env: # Tag of the TCK diff --git a/pom.xml b/pom.xml index 239762c..3cb8ea8 100644 --- a/pom.xml +++ b/pom.xml @@ -117,6 +117,11 @@ a2a-java-sdk-spec ${version.sdk} + + io.github.a2asdk + a2a-tck-server + ${version.sdk} + io.github.a2asdk a2a-java-sdk-tests-server-common diff --git a/tck/pom.xml b/tck/pom.xml index 69b3aec..8e2af7b 100644 --- a/tck/pom.xml +++ b/tck/pom.xml @@ -34,6 +34,16 @@ a2a-java-sdk-spec provided + + io.github.a2asdk + a2a-tck-server + + + * + * + + + jakarta.annotation jakarta.annotation-api diff --git a/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentCardProducer.java b/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentCardProducer.java deleted file mode 100644 index 0b4a752..0000000 --- a/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentCardProducer.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.wildfly.extras.a2a.server.jakarta.tck; - -import java.util.Collections; -import java.util.List; - -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Produces; - -import io.a2a.server.PublicAgentCard; -import io.a2a.spec.AgentCapabilities; -import io.a2a.spec.AgentCard; -import io.a2a.spec.AgentSkill; - -/** - * This is a copy of the AgentCardProducer from the a2a-java SDK's tck/ module - */ -@ApplicationScoped -public class AgentCardProducer { - - @Produces - @PublicAgentCard - public AgentCard agentCard() { - return new AgentCard.Builder() - .name("Hello World Agent") - .description("Just a hello world agent") - .url("http://localhost:9999") - .version("1.0.0") - .documentationUrl("http://example.com/docs") - .capabilities(new AgentCapabilities.Builder() - .streaming(true) - .pushNotifications(true) - .stateTransitionHistory(true) - .build()) - .defaultInputModes(Collections.singletonList("text")) - .defaultOutputModes(Collections.singletonList("text")) - .skills(Collections.singletonList(new AgentSkill.Builder() - .id("hello_world") - .name("Returns hello world") - .description("just returns hello world") - .tags(Collections.singletonList("hello world")) - .examples(List.of("hi", "hello world")) - .build())) - .protocolVersion("0.2.5") - .build(); - } -} - diff --git a/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentExecutorProducer.java b/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentExecutorProducer.java deleted file mode 100644 index 4a2df0c..0000000 --- a/tck/src/main/java/org/wildfly/extras/a2a/server/jakarta/tck/AgentExecutorProducer.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.wildfly.extras.a2a.server.jakarta.tck; - -import jakarta.annotation.PreDestroy; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Produces; - -import io.a2a.server.agentexecution.AgentExecutor; -import io.a2a.server.agentexecution.RequestContext; -import io.a2a.server.events.EventQueue; -import io.a2a.server.tasks.TaskUpdater; -import io.a2a.spec.JSONRPCError; -import io.a2a.spec.Task; -import io.a2a.spec.TaskNotCancelableError; -import io.a2a.spec.TaskNotFoundError; -import io.a2a.spec.TaskState; -import io.a2a.spec.TaskStatus; -import io.a2a.spec.TaskStatusUpdateEvent; - -/** - * This is a copy of the AgentExecutorProducer from the a2a-java SDK's tck/ module - */ -@ApplicationScoped -public class AgentExecutorProducer { - - @Produces - public AgentExecutor agentExecutor() { - return new FireAndForgetAgentExecutor(); - } - - private static class FireAndForgetAgentExecutor implements AgentExecutor { - @Override - public void execute(RequestContext context, EventQueue eventQueue) throws JSONRPCError { - Task task = context.getTask(); - - if (context.getMessage().getTaskId() != null && task == null && context.getMessage().getTaskId().startsWith("non-existent")) { - throw new TaskNotFoundError(); - } - - if (task == null) { - task = new Task.Builder() - .id(context.getTaskId()) - .contextId(context.getContextId()) - .status(new TaskStatus(TaskState.SUBMITTED)) - .history(context.getMessage()) - .build(); - eventQueue.enqueueEvent(task); - } - - TaskUpdater updater = new TaskUpdater(context, eventQueue); - - // Immediately set to WORKING state - updater.startWork(); - System.out.println("====> task set to WORKING, starting background execution"); - - // Method returns immediately - task continues in background - System.out.println("====> execute() method returning immediately, task running in background"); - } - - @Override - public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPCError { - System.out.println("====> task cancel request received"); - Task task = context.getTask(); - - if (task.getStatus().state() == TaskState.CANCELED) { - System.out.println("====> task already canceled"); - throw new TaskNotCancelableError(); - } - - if (task.getStatus().state() == TaskState.COMPLETED) { - System.out.println("====> task already completed"); - throw new TaskNotCancelableError(); - } - - TaskUpdater updater = new TaskUpdater(context, eventQueue); - updater.cancel(); - eventQueue.enqueueEvent(new TaskStatusUpdateEvent.Builder() - .taskId(task.getId()) - .contextId(task.getContextId()) - .status(new TaskStatus(TaskState.CANCELED)) - .isFinal(true) - .build()); - - System.out.println("====> task canceled"); - } - - /** - * Cleanup method for proper resource management - */ - @PreDestroy - public void cleanup() { - System.out.println("====> shutting down task executor"); - } - } -} \ No newline at end of file