@@ -13,6 +13,7 @@ import com.agentclientprotocol.common.ClientSessionOperations
1313import com.agentclientprotocol.common.Event
1414import com.agentclientprotocol.common.SessionParameters
1515import com.agentclientprotocol.framework.ProtocolDriver
16+ import com.agentclientprotocol.model.AcpMethod
1617import com.agentclientprotocol.model.ContentBlock
1718import com.agentclientprotocol.model.LATEST_PROTOCOL_VERSION
1819import com.agentclientprotocol.model.PermissionOption
@@ -22,9 +23,11 @@ import com.agentclientprotocol.model.PromptResponse
2223import com.agentclientprotocol.model.RequestPermissionOutcome
2324import com.agentclientprotocol.model.RequestPermissionResponse
2425import com.agentclientprotocol.model.SessionId
26+ import com.agentclientprotocol.model.SessionNotification
2527import com.agentclientprotocol.model.SessionUpdate
2628import com.agentclientprotocol.model.StopReason
2729import com.agentclientprotocol.model.ToolCallId
30+ import com.agentclientprotocol.protocol.invoke
2831import kotlinx.coroutines.CancellationException
2932import kotlinx.coroutines.CompletableDeferred
3033import kotlinx.coroutines.awaitCancellation
@@ -39,6 +42,8 @@ import kotlinx.serialization.json.JsonElement
3942import kotlin.test.Test
4043import kotlin.test.assertContentEquals
4144import kotlin.test.assertEquals
45+ import kotlin.test.assertTrue
46+ import kotlin.time.Duration.Companion.milliseconds
4247
4348abstract class SimpleAgentTest (protocolDriver : ProtocolDriver ) : ProtocolDriver by protocolDriver {
4449 @Test
@@ -591,5 +596,76 @@ abstract class SimpleAgentTest(protocolDriver: ProtocolDriver) : ProtocolDriver
591596 assertEquals(" Test cancellation" , permissionResponseCe.message, " Cancellation exception should be propagated to agent" )
592597 }
593598
599+ @Test
600+ fun `long session init on client and consequent session update should be properly handler` () = testWithProtocols { clientProtocol, agentProtocol ->
601+ val notificationDeferred = CompletableDeferred <SessionUpdate >()
602+
603+ val client = Client (protocol = clientProtocol, clientSupport = object : ClientSupport {
604+ override suspend fun createClientSession (
605+ session : ClientSession ,
606+ _sessionResponseMeta : JsonElement ? ,
607+ ): ClientSessionOperations {
608+ // long session init
609+ delay(1000 .milliseconds)
610+ return object : ClientSessionOperations {
611+ override suspend fun requestPermissions (
612+ toolCall : SessionUpdate .ToolCallUpdate ,
613+ permissions : List <PermissionOption >,
614+ _meta : JsonElement ? ,
615+ ): RequestPermissionResponse {
616+ TODO ()
617+ }
618+
619+ override suspend fun notify (
620+ notification : SessionUpdate ,
621+ _meta : JsonElement ? ,
622+ ) {
623+ notificationDeferred.complete(notification)
624+ }
625+ }
626+ }
627+ })
628+
629+ val agent = Agent (protocol = agentProtocol, agentSupport = object : AgentSupport {
630+ override suspend fun initialize (clientInfo : ClientInfo ): AgentInfo {
631+ return AgentInfo (clientInfo.protocolVersion)
632+ }
633+
634+ override suspend fun createSession (sessionParameters : SessionParameters ): AgentSession {
635+ val id = SessionId (" test-session-id" )
636+ this @testWithProtocols.launch {
637+ delay(200 .milliseconds)
638+ AcpMethod .ClientMethods .SessionUpdate (agentProtocol, SessionNotification (id, SessionUpdate .AvailableCommandsUpdate (listOf ())))
639+ }
640+
641+ return object : AgentSession {
642+ override val sessionId: SessionId = id
643+
644+ override suspend fun prompt (
645+ content : List <ContentBlock >,
646+ _meta : JsonElement ? ,
647+ ): Flow <Event > = flow {
648+ TODO ()
649+ }
650+ }
651+ }
652+
653+ override suspend fun loadSession (
654+ sessionId : SessionId ,
655+ sessionParameters : SessionParameters ,
656+ ): AgentSession {
657+ TODO (" Not yet implemented" )
658+ }
659+ })
660+ client.initialize(ClientInfo (protocolVersion = LATEST_PROTOCOL_VERSION ))
661+
662+ val session = client.newSession(SessionParameters (" /test/path" , emptyList()))
663+
664+ val notification = withTimeout(5000 .milliseconds) {
665+ notificationDeferred.await()
666+ }
667+ assertTrue(notification is SessionUpdate .AvailableCommandsUpdate )
668+ }
669+
594670
595671}
0 commit comments