Skip to content

Commit 7187b18

Browse files
author
Mark Pollack
committed
Add complete annotation set for Phase 5B.1
New annotations: - @LoadSession - handler for session/load requests - @cancel - handler for session/cancel notifications - @SetSessionMode - handler for session/set_mode requests - @SetSessionModel - handler for session/set_model requests - @AcpExceptionHandler - method-level exception handling (annotation only) New argument resolvers: - LoadSessionRequestResolver - SetSessionModeRequestResolver - SetSessionModelRequestResolver - CancelNotificationResolver Updated DirectResponseHandler to support all response types. Updated AcpAgentSupport to discover and wire new handlers. Added tests for @LoadSession, @SetSessionMode, and @cancel annotations.
1 parent 76ae278 commit 7187b18

File tree

12 files changed

+620
-2
lines changed

12 files changed

+620
-2
lines changed

acp-agent-support/src/main/java/com/agentclientprotocol/sdk/agent/support/AcpAgentSupport.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,38 @@
2626
import com.agentclientprotocol.sdk.agent.support.interceptor.InterceptorChain;
2727
import com.agentclientprotocol.sdk.agent.support.resolver.ArgumentResolver;
2828
import com.agentclientprotocol.sdk.agent.support.resolver.ArgumentResolverComposite;
29+
import com.agentclientprotocol.sdk.agent.support.resolver.CancelNotificationResolver;
2930
import com.agentclientprotocol.sdk.agent.support.resolver.CapabilitiesResolver;
3031
import com.agentclientprotocol.sdk.agent.support.resolver.InitializeRequestResolver;
32+
import com.agentclientprotocol.sdk.agent.support.resolver.LoadSessionRequestResolver;
3133
import com.agentclientprotocol.sdk.agent.support.resolver.NewSessionRequestResolver;
3234
import com.agentclientprotocol.sdk.agent.support.resolver.PromptContextResolver;
3335
import com.agentclientprotocol.sdk.agent.support.resolver.PromptRequestResolver;
3436
import com.agentclientprotocol.sdk.agent.support.resolver.SessionIdResolver;
37+
import com.agentclientprotocol.sdk.agent.support.resolver.SetSessionModeRequestResolver;
38+
import com.agentclientprotocol.sdk.agent.support.resolver.SetSessionModelRequestResolver;
39+
import com.agentclientprotocol.sdk.annotation.Cancel;
3540
import com.agentclientprotocol.sdk.annotation.Initialize;
41+
import com.agentclientprotocol.sdk.annotation.LoadSession;
3642
import com.agentclientprotocol.sdk.annotation.NewSession;
3743
import com.agentclientprotocol.sdk.annotation.Prompt;
44+
import com.agentclientprotocol.sdk.annotation.SetSessionMode;
45+
import com.agentclientprotocol.sdk.annotation.SetSessionModel;
3846
import com.agentclientprotocol.sdk.capabilities.NegotiatedCapabilities;
3947
import com.agentclientprotocol.sdk.spec.AcpAgentTransport;
48+
import com.agentclientprotocol.sdk.spec.AcpSchema.CancelNotification;
4049
import com.agentclientprotocol.sdk.spec.AcpSchema.InitializeRequest;
4150
import com.agentclientprotocol.sdk.spec.AcpSchema.InitializeResponse;
51+
import com.agentclientprotocol.sdk.spec.AcpSchema.LoadSessionRequest;
52+
import com.agentclientprotocol.sdk.spec.AcpSchema.LoadSessionResponse;
4253
import com.agentclientprotocol.sdk.spec.AcpSchema.NewSessionRequest;
4354
import com.agentclientprotocol.sdk.spec.AcpSchema.NewSessionResponse;
4455
import com.agentclientprotocol.sdk.spec.AcpSchema.PromptRequest;
4556
import com.agentclientprotocol.sdk.spec.AcpSchema.PromptResponse;
57+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModeRequest;
58+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModeResponse;
59+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModelRequest;
60+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModelResponse;
4661

4762
import org.slf4j.Logger;
4863
import org.slf4j.LoggerFactory;
@@ -188,6 +203,12 @@ private void wireHandlers(AcpAgent.SyncAgentBuilder agentBuilder) {
188203
java.util.UUID.randomUUID().toString(), null, null));
189204
}
190205

206+
// LoadSession handler
207+
AcpHandlerMethod loadSessionHandler = handlers.get("session/load");
208+
if (loadSessionHandler != null) {
209+
agentBuilder.loadSessionHandler(req -> invokeHandler(loadSessionHandler, req, req.sessionId(), null, null));
210+
}
211+
191212
// Prompt handler
192213
AcpHandlerMethod promptHandler = handlers.get("session/prompt");
193214
if (promptHandler != null) {
@@ -196,6 +217,26 @@ private void wireHandlers(AcpAgent.SyncAgentBuilder agentBuilder) {
196217
return invokeHandler(promptHandler, req, req.sessionId(), syncContext, caps);
197218
});
198219
}
220+
221+
// SetSessionMode handler
222+
AcpHandlerMethod setModeHandler = handlers.get("session/set_mode");
223+
if (setModeHandler != null) {
224+
agentBuilder.setSessionModeHandler(req -> invokeHandler(setModeHandler, req, req.sessionId(), null, null));
225+
}
226+
227+
// SetSessionModel handler
228+
AcpHandlerMethod setModelHandler = handlers.get("session/set_model");
229+
if (setModelHandler != null) {
230+
agentBuilder.setSessionModelHandler(req -> invokeHandler(setModelHandler, req, req.sessionId(), null, null));
231+
}
232+
233+
// Cancel handler
234+
AcpHandlerMethod cancelHandler = handlers.get("session/cancel");
235+
if (cancelHandler != null) {
236+
agentBuilder.cancelHandler(notification -> {
237+
invokeHandler(cancelHandler, notification, notification.sessionId(), null, null);
238+
});
239+
}
199240
}
200241

201242
@SuppressWarnings("unchecked")
@@ -396,10 +437,26 @@ private void discoverHandlers(Class<?> agentClass, Supplier<Object> beanSupplier
396437
handlers.put("session/new", new AcpHandlerMethod(beanSupplier, method, "session/new"));
397438
log.debug("Discovered @NewSession handler: {}", method.getName());
398439
}
440+
if (method.isAnnotationPresent(LoadSession.class)) {
441+
handlers.put("session/load", new AcpHandlerMethod(beanSupplier, method, "session/load"));
442+
log.debug("Discovered @LoadSession handler: {}", method.getName());
443+
}
399444
if (method.isAnnotationPresent(Prompt.class)) {
400445
handlers.put("session/prompt", new AcpHandlerMethod(beanSupplier, method, "session/prompt"));
401446
log.debug("Discovered @Prompt handler: {}", method.getName());
402447
}
448+
if (method.isAnnotationPresent(SetSessionMode.class)) {
449+
handlers.put("session/set_mode", new AcpHandlerMethod(beanSupplier, method, "session/set_mode"));
450+
log.debug("Discovered @SetSessionMode handler: {}", method.getName());
451+
}
452+
if (method.isAnnotationPresent(SetSessionModel.class)) {
453+
handlers.put("session/set_model", new AcpHandlerMethod(beanSupplier, method, "session/set_model"));
454+
log.debug("Discovered @SetSessionModel handler: {}", method.getName());
455+
}
456+
if (method.isAnnotationPresent(Cancel.class)) {
457+
handlers.put("session/cancel", new AcpHandlerMethod(beanSupplier, method, "session/cancel"));
458+
log.debug("Discovered @Cancel handler: {}", method.getName());
459+
}
403460
}
404461
}
405462

@@ -408,7 +465,11 @@ private void addDefaultResolvers() {
408465
// Custom resolvers added via builder go first
409466
argumentResolvers.addResolver(new InitializeRequestResolver());
410467
argumentResolvers.addResolver(new NewSessionRequestResolver());
468+
argumentResolvers.addResolver(new LoadSessionRequestResolver());
411469
argumentResolvers.addResolver(new PromptRequestResolver());
470+
argumentResolvers.addResolver(new SetSessionModeRequestResolver());
471+
argumentResolvers.addResolver(new SetSessionModelRequestResolver());
472+
argumentResolvers.addResolver(new CancelNotificationResolver());
412473
argumentResolvers.addResolver(new PromptContextResolver());
413474
argumentResolvers.addResolver(new SessionIdResolver());
414475
argumentResolvers.addResolver(new CapabilitiesResolver());

acp-agent-support/src/main/java/com/agentclientprotocol/sdk/agent/support/handler/DirectResponseHandler.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,18 @@
77
import com.agentclientprotocol.sdk.agent.support.AcpInvocationContext;
88
import com.agentclientprotocol.sdk.agent.support.AcpMethodParameter;
99
import com.agentclientprotocol.sdk.spec.AcpSchema.InitializeResponse;
10+
import com.agentclientprotocol.sdk.spec.AcpSchema.LoadSessionResponse;
1011
import com.agentclientprotocol.sdk.spec.AcpSchema.NewSessionResponse;
1112
import com.agentclientprotocol.sdk.spec.AcpSchema.PromptResponse;
13+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModeResponse;
14+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModelResponse;
1215

1316
/**
1417
* Handles direct protocol response types that need no conversion.
1518
*
1619
* <p>Supports {@link InitializeResponse}, {@link NewSessionResponse},
17-
* and {@link PromptResponse}.
20+
* {@link LoadSessionResponse}, {@link PromptResponse}, {@link SetSessionModeResponse},
21+
* and {@link SetSessionModelResponse}.
1822
*
1923
* @author Mark Pollack
2024
* @since 1.0.0
@@ -26,7 +30,10 @@ public boolean supportsReturnType(AcpMethodParameter returnType) {
2630
Class<?> type = returnType.getParameterType();
2731
return InitializeResponse.class.isAssignableFrom(type)
2832
|| NewSessionResponse.class.isAssignableFrom(type)
29-
|| PromptResponse.class.isAssignableFrom(type);
33+
|| LoadSessionResponse.class.isAssignableFrom(type)
34+
|| PromptResponse.class.isAssignableFrom(type)
35+
|| SetSessionModeResponse.class.isAssignableFrom(type)
36+
|| SetSessionModelResponse.class.isAssignableFrom(type);
3037
}
3138

3239
@Override
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2025-2026 the original author or authors.
3+
*/
4+
5+
package com.agentclientprotocol.sdk.agent.support.resolver;
6+
7+
import com.agentclientprotocol.sdk.agent.support.AcpInvocationContext;
8+
import com.agentclientprotocol.sdk.agent.support.AcpMethodParameter;
9+
import com.agentclientprotocol.sdk.spec.AcpSchema.CancelNotification;
10+
11+
/**
12+
* Resolves {@link CancelNotification} parameters in cancel handlers.
13+
*
14+
* @author Mark Pollack
15+
* @since 1.0.0
16+
*/
17+
public class CancelNotificationResolver implements ArgumentResolver {
18+
19+
@Override
20+
public boolean supportsParameter(AcpMethodParameter parameter) {
21+
return CancelNotification.class.isAssignableFrom(parameter.getParameterType());
22+
}
23+
24+
@Override
25+
public Object resolveArgument(AcpMethodParameter parameter, AcpInvocationContext context) {
26+
Object request = context.getRequest();
27+
if (request instanceof CancelNotification) {
28+
return request;
29+
}
30+
throw new ArgumentResolutionException("Expected CancelNotification but got: "
31+
+ (request != null ? request.getClass().getName() : "null"));
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2025-2026 the original author or authors.
3+
*/
4+
5+
package com.agentclientprotocol.sdk.agent.support.resolver;
6+
7+
import com.agentclientprotocol.sdk.agent.support.AcpInvocationContext;
8+
import com.agentclientprotocol.sdk.agent.support.AcpMethodParameter;
9+
import com.agentclientprotocol.sdk.spec.AcpSchema.LoadSessionRequest;
10+
11+
/**
12+
* Resolves {@link LoadSessionRequest} parameters in load session handlers.
13+
*
14+
* @author Mark Pollack
15+
* @since 1.0.0
16+
*/
17+
public class LoadSessionRequestResolver implements ArgumentResolver {
18+
19+
@Override
20+
public boolean supportsParameter(AcpMethodParameter parameter) {
21+
return LoadSessionRequest.class.isAssignableFrom(parameter.getParameterType());
22+
}
23+
24+
@Override
25+
public Object resolveArgument(AcpMethodParameter parameter, AcpInvocationContext context) {
26+
Object request = context.getRequest();
27+
if (request instanceof LoadSessionRequest) {
28+
return request;
29+
}
30+
throw new ArgumentResolutionException(
31+
"Expected LoadSessionRequest but got: " + (request != null ? request.getClass().getName() : "null"));
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2025-2026 the original author or authors.
3+
*/
4+
5+
package com.agentclientprotocol.sdk.agent.support.resolver;
6+
7+
import com.agentclientprotocol.sdk.agent.support.AcpInvocationContext;
8+
import com.agentclientprotocol.sdk.agent.support.AcpMethodParameter;
9+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModeRequest;
10+
11+
/**
12+
* Resolves {@link SetSessionModeRequest} parameters in set session mode handlers.
13+
*
14+
* @author Mark Pollack
15+
* @since 1.0.0
16+
*/
17+
public class SetSessionModeRequestResolver implements ArgumentResolver {
18+
19+
@Override
20+
public boolean supportsParameter(AcpMethodParameter parameter) {
21+
return SetSessionModeRequest.class.isAssignableFrom(parameter.getParameterType());
22+
}
23+
24+
@Override
25+
public Object resolveArgument(AcpMethodParameter parameter, AcpInvocationContext context) {
26+
Object request = context.getRequest();
27+
if (request instanceof SetSessionModeRequest) {
28+
return request;
29+
}
30+
throw new ArgumentResolutionException("Expected SetSessionModeRequest but got: "
31+
+ (request != null ? request.getClass().getName() : "null"));
32+
}
33+
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2025-2026 the original author or authors.
3+
*/
4+
5+
package com.agentclientprotocol.sdk.agent.support.resolver;
6+
7+
import com.agentclientprotocol.sdk.agent.support.AcpInvocationContext;
8+
import com.agentclientprotocol.sdk.agent.support.AcpMethodParameter;
9+
import com.agentclientprotocol.sdk.spec.AcpSchema.SetSessionModelRequest;
10+
11+
/**
12+
* Resolves {@link SetSessionModelRequest} parameters in set session model handlers.
13+
*
14+
* @author Mark Pollack
15+
* @since 1.0.0
16+
*/
17+
public class SetSessionModelRequestResolver implements ArgumentResolver {
18+
19+
@Override
20+
public boolean supportsParameter(AcpMethodParameter parameter) {
21+
return SetSessionModelRequest.class.isAssignableFrom(parameter.getParameterType());
22+
}
23+
24+
@Override
25+
public Object resolveArgument(AcpMethodParameter parameter, AcpInvocationContext context) {
26+
Object request = context.getRequest();
27+
if (request instanceof SetSessionModelRequest) {
28+
return request;
29+
}
30+
throw new ArgumentResolutionException("Expected SetSessionModelRequest but got: "
31+
+ (request != null ? request.getClass().getName() : "null"));
32+
}
33+
34+
}

0 commit comments

Comments
 (0)