22
33package io.agentclientprotocol.agent
44
5- import io.agentclientprotocol.model.ACPJson
6- import io.agentclientprotocol.agent.Agent
7- import io.agentclientprotocol.model.AgentMethods
8- import io.agentclientprotocol.model.AuthenticateRequest
9- import io.agentclientprotocol.model.CancelNotification
105import io.agentclientprotocol.client.Client
11- import io.agentclientprotocol.model.ClientMethods
12- import io.agentclientprotocol.model.InitializeRequest
13- import io.agentclientprotocol.model.LATEST_PROTOCOL_VERSION
14- import io.agentclientprotocol.model.LoadSessionRequest
15- import io.agentclientprotocol.model.NewSessionRequest
16- import io.agentclientprotocol.model.PromptRequest
17- import io.agentclientprotocol.model.ReadTextFileRequest
18- import io.agentclientprotocol.model.ReadTextFileResponse
19- import io.agentclientprotocol.model.RequestPermissionRequest
20- import io.agentclientprotocol.model.RequestPermissionResponse
21- import io.agentclientprotocol.model.SessionNotification
22- import io.agentclientprotocol.model.WriteTextFileRequest
6+ import io.agentclientprotocol.model.*
237import io.agentclientprotocol.protocol.Protocol
248import io.agentclientprotocol.protocol.ProtocolOptions
9+ import io.agentclientprotocol.rpc.ACPJson
2510import io.agentclientprotocol.transport.Transport
2611import io.github.oshai.kotlinlogging.KotlinLogging
12+ import kotlinx.coroutines.CoroutineScope
2713import kotlinx.serialization.json.JsonNull
2814import kotlinx.serialization.json.decodeFromJsonElement
2915import kotlinx.serialization.json.encodeToJsonElement
@@ -41,95 +27,98 @@ private val logger = KotlinLogging.logger {}
4127 * See protocol docs: [Agent](https://agentclientprotocol.com/protocol/overview#agent)
4228 */
4329public class AgentSideConnection (
30+ private val parentScope : CoroutineScope ,
4431 private val agent : Agent ,
32+ private val transport : Transport ,
4533 options : ProtocolOptions = ProtocolOptions ()
46- ) : Protocol(options), Client {
34+ ) : Client {
35+ private val protocol = Protocol (parentScope, transport, options)
36+
37+ public fun start () {
4738
48- override suspend fun connect (transport : Transport ) {
49- super .connect(transport)
50-
5139 // Set up request handlers for incoming client requests
52- setRequestHandler(AgentMethods .INITIALIZE ) { request ->
40+ protocol. setRequestHandler(AgentMethods .INITIALIZE ) { request ->
5341 val params = if (request.params != null ) {
54- ACPJson .decodeFromJsonElement<InitializeRequest >(request.params!! )
42+ ACPJson .decodeFromJsonElement<InitializeRequest >(request.params)
5543 } else {
5644 InitializeRequest (LATEST_PROTOCOL_VERSION )
5745 }
5846 val response = agent.initialize(params)
5947 ACPJson .encodeToJsonElement(response)
6048 }
6149
62- setRequestHandler(AgentMethods .AUTHENTICATE ) { request ->
50+ protocol. setRequestHandler(AgentMethods .AUTHENTICATE ) { request ->
6351 val params = if (request.params != null ) {
64- ACPJson .decodeFromJsonElement<AuthenticateRequest >(request.params!! )
52+ ACPJson .decodeFromJsonElement<AuthenticateRequest >(request.params)
6553 } else {
6654 throw IllegalArgumentException (" authenticate requires parameters" )
6755 }
6856 agent.authenticate(params)
6957 JsonNull // No response body for authenticate
7058 }
7159
72- setRequestHandler(AgentMethods .SESSION_NEW ) { request ->
60+ protocol. setRequestHandler(AgentMethods .SESSION_NEW ) { request ->
7361 val params = if (request.params != null ) {
74- ACPJson .decodeFromJsonElement<NewSessionRequest >(request.params!! )
62+ ACPJson .decodeFromJsonElement<NewSessionRequest >(request.params)
7563 } else {
7664 throw IllegalArgumentException (" session/new requires parameters" )
7765 }
7866 val response = agent.newSession(params)
7967 ACPJson .encodeToJsonElement(response)
8068 }
8169
82- setRequestHandler(AgentMethods .SESSION_LOAD ) { request ->
70+ protocol. setRequestHandler(AgentMethods .SESSION_LOAD ) { request ->
8371 val params = if (request.params != null ) {
84- ACPJson .decodeFromJsonElement<LoadSessionRequest >(request.params!! )
72+ ACPJson .decodeFromJsonElement<LoadSessionRequest >(request.params)
8573 } else {
8674 throw IllegalArgumentException (" session/load requires parameters" )
8775 }
8876 agent.loadSession(params)
8977 JsonNull // No response body for loadSession
9078 }
9179
92- setRequestHandler(AgentMethods .SESSION_PROMPT ) { request ->
80+ protocol. setRequestHandler(AgentMethods .SESSION_PROMPT ) { request ->
9381 val params = if (request.params != null ) {
94- ACPJson .decodeFromJsonElement<PromptRequest >(request.params!! )
82+ ACPJson .decodeFromJsonElement<PromptRequest >(request.params)
9583 } else {
9684 throw IllegalArgumentException (" session/prompt requires parameters" )
9785 }
9886 val response = agent.prompt(params)
9987 ACPJson .encodeToJsonElement(response)
10088 }
10189
102- setNotificationHandler(AgentMethods .SESSION_CANCEL ) { notification ->
90+ protocol. setNotificationHandler(AgentMethods .SESSION_CANCEL ) { notification ->
10391 val params = if (notification.params != null ) {
104- ACPJson .decodeFromJsonElement<CancelNotification >(notification.params!! )
92+ ACPJson .decodeFromJsonElement<CancelNotification >(notification.params)
10593 } else {
10694 throw IllegalArgumentException (" session/cancel requires parameters" )
10795 }
10896 agent.cancel(params)
10997 }
11098
99+ protocol.start()
111100 logger.info { " Agent-side connection established" }
112101 }
113102
114103 override suspend fun sessionUpdate (notification : SessionNotification ) {
115104 val params = ACPJson .encodeToJsonElement(notification)
116- sendNotification(ClientMethods .SESSION_UPDATE , params)
105+ protocol. sendNotification(ClientMethods .SESSION_UPDATE , params)
117106 }
118107
119108 override suspend fun requestPermission (request : RequestPermissionRequest ): RequestPermissionResponse {
120109 val params = ACPJson .encodeToJsonElement(request)
121- val responseJson = sendRequest(ClientMethods .SESSION_REQUEST_PERMISSION , params)
110+ val responseJson = protocol. sendRequest(ClientMethods .SESSION_REQUEST_PERMISSION , params)
122111 return ACPJson .decodeFromJsonElement(responseJson)
123112 }
124113
125114 override suspend fun readTextFile (request : ReadTextFileRequest ): ReadTextFileResponse {
126115 val params = ACPJson .encodeToJsonElement(request)
127- val responseJson = sendRequest(ClientMethods .FS_READ_TEXT_FILE , params)
116+ val responseJson = protocol. sendRequest(ClientMethods .FS_READ_TEXT_FILE , params)
128117 return ACPJson .decodeFromJsonElement(responseJson)
129118 }
130119
131120 override suspend fun writeTextFile (request : WriteTextFileRequest ) {
132121 val params = ACPJson .encodeToJsonElement(request)
133- sendRequest(ClientMethods .FS_WRITE_TEXT_FILE , params)
122+ protocol. sendRequest(ClientMethods .FS_WRITE_TEXT_FILE , params)
134123 }
135124}
0 commit comments