import com.agentclientprotocol.sdk.test.InMemoryTransportPair;
import com.agentclientprotocol.sdk.agent.*;
import com.agentclientprotocol.sdk.client.*;
import com.agentclientprotocol.sdk.spec.AcpSchema.*;
import reactor.core.publisher.Mono;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
// 1. Create in-memory transport pair
var transportPair = InMemoryTransportPair.create();
// 2. Create agent (using async API here)
AtomicReference<String> receivedPrompt = new AtomicReference<>();
AcpAsyncAgent agent = AcpAgent.async(transportPair.agentTransport())
.initializeHandler(req -> Mono.just(InitializeResponse.ok()))
.newSessionHandler(req ->
Mono.just(new NewSessionResponse(
UUID.randomUUID().toString(), null, null)))
.promptHandler((req, context) -> {
String text = req.text();
receivedPrompt.set(text);
return context.sendMessage("Echo: " + text)
.then(Mono.just(PromptResponse.endTurn()));
})
.build();
agent.start().subscribe();
// 3. Create client
AtomicReference<String> receivedMessage = new AtomicReference<>();
AcpSyncClient client = AcpClient.sync(transportPair.clientTransport())
.sessionUpdateConsumer(notification -> {
if (notification.update() instanceof AgentMessageChunk msg) {
receivedMessage.set(((TextContent) msg.content()).text());
}
})
.build();
// 4. Run test
client.initialize();
var session = client.newSession(new NewSessionRequest(".", List.of()));
client.prompt(new PromptRequest(
session.sessionId(),
List.of(new TextContent("Hello from in-memory test!"))
));
// 5. Verify
assert "Hello from in-memory test!".equals(receivedPrompt.get());
assert "Echo: Hello from in-memory test!".equals(receivedMessage.get());
// 6. Cleanup
client.close();
transportPair.closeGracefully().block();