diff --git a/acp-ktor-test/src/commonTest/kotlin/com/agentclientprotocol/FeaturesTest.kt b/acp-ktor-test/src/commonTest/kotlin/com/agentclientprotocol/FeaturesTest.kt index d80f757..b10b67b 100644 --- a/acp-ktor-test/src/commonTest/kotlin/com/agentclientprotocol/FeaturesTest.kt +++ b/acp-ktor-test/src/commonTest/kotlin/com/agentclientprotocol/FeaturesTest.kt @@ -5,10 +5,14 @@ import com.agentclientprotocol.agent.AgentInfo import com.agentclientprotocol.agent.AgentSession import com.agentclientprotocol.agent.AgentSupport import com.agentclientprotocol.agent.client +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.client.* import com.agentclientprotocol.common.* import com.agentclientprotocol.framework.ProtocolDriver import com.agentclientprotocol.model.* +import com.agentclientprotocol.protocol.jsonRpcRequest +import com.agentclientprotocol.rpc.RequestId +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow @@ -192,6 +196,501 @@ abstract class FeaturesTest(protocolDriver: ProtocolDriver) : ProtocolDriver by + @OptIn(UnstableApi::class) + @Test + fun `form elicitation from agent returns accepted response`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val elicitationResult = CompletableDeferred() + + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + emit(Event.SessionUpdateEvent(agentTextChunk("Before elicitation"))) + val client = currentCoroutineContext().client + val schema = ElicitationSchema( + properties = mapOf( + "name" to ElicitationPropertySchema.StringProperty(title = "Your name") + ), + required = listOf("name") + ) + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Form(requestedSchema = schema), + message = "Please provide your name" + ) + val response = client.createElicitation(request) + val action = response.action + if (action is ElicitationAction.Accept) { + val nameValue = action.content?.get("name") + if (nameValue is ElicitationContentValue.StringValue) { + elicitationResult.complete(nameValue.value) + emit(Event.SessionUpdateEvent(agentTextChunk("Got name: ${nameValue.value}"))) + } + } + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + assertEquals("Please provide your name", request.message) + assertTrue(request.mode is ElicitationMode.Form) + return CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf("name" to ElicitationContentValue.StringValue("Alice")) + ) + ) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Before elicitation", "Got name: Alice", "END_TURN"), result) + assertEquals("Alice", elicitationResult.await()) + } + + @OptIn(UnstableApi::class) + @Test + fun `form elicitation declined by user`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val client = currentCoroutineContext().client + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Form( + requestedSchema = ElicitationSchema( + properties = mapOf( + "confirm" to ElicitationPropertySchema.BooleanProperty(title = "Confirm?") + ) + ) + ), + message = "Please confirm" + ) + val response = client.createElicitation(request) + when (response.action) { + is ElicitationAction.Decline -> emit(Event.SessionUpdateEvent(agentTextChunk("User declined"))) + is ElicitationAction.Cancel -> emit(Event.SessionUpdateEvent(agentTextChunk("User cancelled"))) + is ElicitationAction.Accept -> emit(Event.SessionUpdateEvent(agentTextChunk("User accepted"))) + } + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + return CreateElicitationResponse(action = ElicitationAction.Decline) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("User declined", "END_TURN"), result) + } + + @OptIn(UnstableApi::class) + @Test + fun `url elicitation from agent returns accepted response`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val completionReceived = CompletableDeferred() + + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val client = currentCoroutineContext().client + val elicitationId = ElicitationId("url-elicit-1") + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Url( + elicitationId = elicitationId, + url = "https://example.com/auth" + ), + message = "Please authenticate" + ) + val response = client.createElicitation(request) + assertTrue(response.action is ElicitationAction.Accept, "Expected Accept action for URL elicitation") + emit(Event.SessionUpdateEvent(agentTextChunk("URL elicitation accepted"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + url = ElicitationUrlCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + assertEquals("Please authenticate", request.message) + val mode = request.mode + assertTrue(mode is ElicitationMode.Url) + assertEquals("https://example.com/auth", mode.url) + assertEquals(ElicitationId("url-elicit-1"), mode.elicitationId) + return CreateElicitationResponse(action = ElicitationAction.Accept()) + } + + override suspend fun completeElicitation( + notification: CompleteElicitationNotification + ) { + completionReceived.complete(notification.elicitationId) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("URL elicitation accepted", "END_TURN"), result) + } + + @OptIn(UnstableApi::class) + @Test + fun `form elicitation with complex schema`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val client = currentCoroutineContext().client + val schema = ElicitationSchema( + title = "User Profile", + properties = mapOf( + "name" to ElicitationPropertySchema.StringProperty( + title = "Name", + minLength = 1, + maxLength = 100 + ), + "age" to ElicitationPropertySchema.IntegerProperty( + title = "Age", + minimum = 0, + maximum = 150 + ), + "score" to ElicitationPropertySchema.NumberProperty( + title = "Score", + minimum = 0.0, + maximum = 100.0 + ), + "active" to ElicitationPropertySchema.BooleanProperty( + title = "Active?", + default = true + ) + ), + required = listOf("name", "age") + ) + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Form(requestedSchema = schema), + message = "Fill in your profile" + ) + val response = client.createElicitation(request) + val action = response.action as ElicitationAction.Accept + val content = action.content!! + val name = (content["name"] as ElicitationContentValue.StringValue).value + val age = (content["age"] as ElicitationContentValue.IntegerValue).value + val score = (content["score"] as ElicitationContentValue.NumberValue).value + val active = (content["active"] as ElicitationContentValue.BooleanValue).value + emit(Event.SessionUpdateEvent(agentTextChunk("$name,$age,$score,$active"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + val mode = request.mode as ElicitationMode.Form + assertEquals("User Profile", mode.requestedSchema.title) + assertEquals(4, mode.requestedSchema.properties.size) + assertEquals(listOf("name", "age"), mode.requestedSchema.required) + return CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf( + "name" to ElicitationContentValue.StringValue("Bob"), + "age" to ElicitationContentValue.IntegerValue(30), + "score" to ElicitationContentValue.NumberValue(95.5), + "active" to ElicitationContentValue.BooleanValue(true) + ) + ) + ) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Bob,30,95.5,true", "END_TURN"), result) + } + + @OptIn(UnstableApi::class) + @Test + fun `elicitation cancelled by user`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val client = currentCoroutineContext().client + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Form( + requestedSchema = ElicitationSchema( + properties = mapOf( + "input" to ElicitationPropertySchema.StringProperty(title = "Input") + ) + ) + ), + message = "Provide input" + ) + val response = client.createElicitation(request) + assertTrue(response.action is ElicitationAction.Cancel) + emit(Event.SessionUpdateEvent(agentTextChunk("Cancelled"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + return CreateElicitationResponse(action = ElicitationAction.Cancel) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Cancelled", "END_TURN"), result) + } + + @OptIn(UnstableApi::class) + @Test + fun `url elicitation complete notification is delivered to session`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + val completionReceived = CompletableDeferred() + + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val clientOps = currentCoroutineContext().client + val elicitationId = ElicitationId("url-complete-1") + val request = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("test-session-id")), + mode = ElicitationMode.Url( + elicitationId = elicitationId, + url = "https://example.com/oauth" + ), + message = "Please authenticate via URL" + ) + val response = clientOps.createElicitation(request) + assertTrue(response.action is ElicitationAction.Accept) + + // Now send the completion notification + clientOps.completeElicitation(CompleteElicitationNotification(elicitationId)) + // Small delay to let the notification propagate + delay(200) + + emit(Event.SessionUpdateEvent(agentTextChunk("Completed"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + url = ElicitationUrlCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + return CreateElicitationResponse(action = ElicitationAction.Accept()) + } + + override suspend fun completeElicitation( + notification: CompleteElicitationNotification + ) { + completionReceived.complete(notification.elicitationId) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Completed", "END_TURN"), result) + assertEquals(ElicitationId("url-complete-1"), completionReceived.await()) + } + + @OptIn(UnstableApi::class) + @Test + fun `request-scoped elicitation routed to session via in-flight request`() = testWithProtocols { clientProtocol, agentProtocol -> + val client = Client(protocol = clientProtocol) + + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val clientOps = currentCoroutineContext().client + // Get the current incoming request ID — this is the prompt request from the client + val incomingRequestId = currentCoroutineContext().jsonRpcRequest.id + val request = CreateElicitationRequest( + scope = ElicitationScope.Request(incomingRequestId), + mode = ElicitationMode.Form( + requestedSchema = ElicitationSchema( + properties = mapOf( + "answer" to ElicitationPropertySchema.StringProperty(title = "Answer") + ) + ) + ), + message = "Request-scoped elicitation" + ) + val response = clientOps.createElicitation(request) + val action = response.action as ElicitationAction.Accept + val answer = (action.content!!["answer"] as ElicitationContentValue.StringValue).value + emit(Event.SessionUpdateEvent(agentTextChunk("Answer: $answer"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations { + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + assertTrue(request.scope is ElicitationScope.Request, "Expected Request scope") + assertEquals("Request-scoped elicitation", request.message) + return CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf("answer" to ElicitationContentValue.StringValue("via request scope")) + ) + ) + } + } + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Answer: via request scope", "END_TURN"), result) + } + + @OptIn(UnstableApi::class) + @Test + fun `request-scoped elicitation falls back to global handler`() = testWithProtocols { clientProtocol, agentProtocol -> + val globalHandlerCalled = CompletableDeferred() + + val client = Client( + protocol = clientProtocol, + globalElicitationHandler = GlobalElicitationHandler { request -> + globalHandlerCalled.complete(request) + CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf("key" to ElicitationContentValue.StringValue("from global")) + ) + ) + } + ) + + val agentSupport = TestAgentSupport { + object : TestAgentSession() { + override suspend fun prompt(content: List, _meta: JsonElement?): Flow = flow { + val clientOps = currentCoroutineContext().client + // Use a request ID that doesn't correspond to any in-flight outgoing request + val request = CreateElicitationRequest( + scope = ElicitationScope.Request(RequestId.create(999999)), + mode = ElicitationMode.Form( + requestedSchema = ElicitationSchema( + properties = mapOf( + "key" to ElicitationPropertySchema.StringProperty(title = "Key") + ) + ) + ), + message = "Global handler elicitation" + ) + val response = clientOps.createElicitation(request) + val action = response.action as ElicitationAction.Accept + val value = (action.content!!["key"] as ElicitationContentValue.StringValue).value + emit(Event.SessionUpdateEvent(agentTextChunk("Got: $value"))) + } + } + } + Agent(agentProtocol, agentSupport) + + client.initialize( + ClientInfo( + capabilities = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities() + ) + ) + ) + ) + val session = client.newSession(SessionCreationParameters("/test/path", emptyList())) { _, _ -> + object : TestClientSessionOperations(), ElicitationOperations {} + } + val result = session.promptToList("Test") + assertContentEquals(listOf("Got: from global", "END_TURN"), result) + + val receivedRequest = globalHandlerCalled.await() + assertEquals("Global handler elicitation", receivedRequest.message) + assertTrue(receivedRequest.scope is ElicitationScope.Request) + } + // @Test // fun `call agent extension from client`(): TestResult = testWithProtocols { clientProtocol, agentProtocol -> // diff --git a/acp-model/api/acp-model.api b/acp-model/api/acp-model.api index 0e5e5bc..f245fc5 100644 --- a/acp-model/api/acp-model.api +++ b/acp-model/api/acp-model.api @@ -175,6 +175,14 @@ public final class com/agentclientprotocol/model/AcpMethod$ClientMethods { public static final field INSTANCE Lcom/agentclientprotocol/model/AcpMethod$ClientMethods; } +public final class com/agentclientprotocol/model/AcpMethod$ClientMethods$ElicitationComplete : com/agentclientprotocol/model/AcpMethod$AcpNotificationMethod { + public static final field INSTANCE Lcom/agentclientprotocol/model/AcpMethod$ClientMethods$ElicitationComplete; +} + +public final class com/agentclientprotocol/model/AcpMethod$ClientMethods$ElicitationCreate : com/agentclientprotocol/model/AcpMethod$AcpRequestResponseMethod { + public static final field INSTANCE Lcom/agentclientprotocol/model/AcpMethod$ClientMethods$ElicitationCreate; +} + public final class com/agentclientprotocol/model/AcpMethod$ClientMethods$FsReadTextFile : com/agentclientprotocol/model/AcpMethod$AcpSessionRequestResponseMethod { public static final field INSTANCE Lcom/agentclientprotocol/model/AcpMethod$ClientMethods$FsReadTextFile; } @@ -752,6 +760,39 @@ public final class com/agentclientprotocol/model/AvailableCommandInput$Unstructu public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/BooleanPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/BooleanPropertySchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)Lcom/agentclientprotocol/model/BooleanPropertySchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/BooleanPropertySchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/agentclientprotocol/model/BooleanPropertySchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Boolean; + public final fun getDescription ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/BooleanPropertySchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/BooleanPropertySchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/BooleanPropertySchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/BooleanPropertySchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/BooleanPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/CancelNotification : com/agentclientprotocol/model/AcpNotification, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/CancelNotification$Companion; public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -809,18 +850,20 @@ public final class com/agentclientprotocol/model/CancelRequestNotification$Compa public final class com/agentclientprotocol/model/ClientCapabilities : com/agentclientprotocol/model/AcpCapabilities, com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/ClientCapabilities$Companion; public fun ()V - public fun (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/ElicitationCapabilities;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/ElicitationCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lcom/agentclientprotocol/model/FileSystemCapability; public final fun component2 ()Z public final fun component3 ()Lcom/agentclientprotocol/model/AuthCapabilities; public final fun component4 ()Lcom/agentclientprotocol/model/ClientNesCapabilities; public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ClientCapabilities; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ClientCapabilities; + public final fun component6 ()Lcom/agentclientprotocol/model/ElicitationCapabilities; + public final fun component7 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/ElicitationCapabilities;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ClientCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/AuthCapabilities;Lcom/agentclientprotocol/model/ClientNesCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/ElicitationCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ClientCapabilities; public fun equals (Ljava/lang/Object;)Z public final fun getAuth ()Lcom/agentclientprotocol/model/AuthCapabilities; + public final fun getElicitation ()Lcom/agentclientprotocol/model/ElicitationCapabilities; public final fun getFs ()Lcom/agentclientprotocol/model/FileSystemCapability; public final fun getNes ()Lcom/agentclientprotocol/model/ClientNesCapabilities; public final fun getPositionEncodings ()Ljava/util/List; @@ -998,6 +1041,36 @@ public final class com/agentclientprotocol/model/CloseSessionResponse$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/CompleteElicitationNotification : com/agentclientprotocol/model/AcpNotification { + public static final field Companion Lcom/agentclientprotocol/model/CompleteElicitationNotification$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-WWIfWFI ()Ljava/lang/String; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy-hBnOb4M (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/CompleteElicitationNotification; + public static synthetic fun copy-hBnOb4M$default (Lcom/agentclientprotocol/model/CompleteElicitationNotification;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/CompleteElicitationNotification; + public fun equals (Ljava/lang/Object;)Z + public final fun getElicitationId-WWIfWFI ()Ljava/lang/String; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/CompleteElicitationNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/CompleteElicitationNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/CompleteElicitationNotification; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/CompleteElicitationNotification;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/CompleteElicitationNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract class com/agentclientprotocol/model/ContentBlock : com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/ContentBlock$Companion; public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V @@ -1217,6 +1290,48 @@ public final class com/agentclientprotocol/model/Cost$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/CreateElicitationRequest : com/agentclientprotocol/model/AcpRequest { + public static final field Companion Lcom/agentclientprotocol/model/CreateElicitationRequest$Companion; + public fun (Lcom/agentclientprotocol/model/ElicitationScope;Lcom/agentclientprotocol/model/ElicitationMode;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationScope;Lcom/agentclientprotocol/model/ElicitationMode;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationScope; + public final fun component2 ()Lcom/agentclientprotocol/model/ElicitationMode; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationScope;Lcom/agentclientprotocol/model/ElicitationMode;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/CreateElicitationRequest; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/CreateElicitationRequest;Lcom/agentclientprotocol/model/ElicitationScope;Lcom/agentclientprotocol/model/ElicitationMode;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/CreateElicitationRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getMessage ()Ljava/lang/String; + public final fun getMode ()Lcom/agentclientprotocol/model/ElicitationMode; + public final fun getScope ()Lcom/agentclientprotocol/model/ElicitationScope; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/CreateElicitationRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/CreateElicitationResponse : com/agentclientprotocol/model/AcpResponse { + public static final field Companion Lcom/agentclientprotocol/model/CreateElicitationResponse$Companion; + public fun (Lcom/agentclientprotocol/model/ElicitationAction;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationAction;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationAction; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationAction;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/CreateElicitationResponse; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/CreateElicitationResponse;Lcom/agentclientprotocol/model/ElicitationAction;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/CreateElicitationResponse; + public fun equals (Ljava/lang/Object;)Z + public final fun getAction ()Lcom/agentclientprotocol/model/ElicitationAction; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/CreateElicitationResponse$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/CreateTerminalRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/CreateTerminalRequest$Companion; public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Lkotlin/ULong;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -1389,77 +1504,694 @@ public final synthetic class com/agentclientprotocol/model/DidFocusDocumentNotif public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/DidFocusDocumentNotification$Companion { +public final class com/agentclientprotocol/model/DidFocusDocumentNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/DidOpenDocumentNotification : com/agentclientprotocol/model/AcpNotification, com/agentclientprotocol/model/AcpWithSessionId { + public static final field Companion Lcom/agentclientprotocol/model/DidOpenDocumentNotification$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-7EW-EgU ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()J + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy-PBEKwEQ (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; + public static synthetic fun copy-PBEKwEQ$default (Lcom/agentclientprotocol/model/DidOpenDocumentNotification;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; + public fun equals (Ljava/lang/Object;)Z + public final fun getLanguageId ()Ljava/lang/String; + public fun getSessionId-7EW-EgU ()Ljava/lang/String; + public final fun getText ()Ljava/lang/String; + public final fun getUri ()Ljava/lang/String; + public final fun getVersion ()J + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/DidOpenDocumentNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/DidOpenDocumentNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/DidOpenDocumentNotification;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/DidOpenDocumentNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/DidSaveDocumentNotification : com/agentclientprotocol/model/AcpNotification, com/agentclientprotocol/model/AcpWithSessionId { + public static final field Companion Lcom/agentclientprotocol/model/DidSaveDocumentNotification$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-7EW-EgU ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy-nk3TnMc (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; + public static synthetic fun copy-nk3TnMc$default (Lcom/agentclientprotocol/model/DidSaveDocumentNotification;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getSessionId-7EW-EgU ()Ljava/lang/String; + public final fun getUri ()Ljava/lang/String; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/DidSaveDocumentNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/DidSaveDocumentNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/DidSaveDocumentNotification;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/DidSaveDocumentNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class com/agentclientprotocol/model/ElicitationAction { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationAction$Companion; + public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/ElicitationAction;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class com/agentclientprotocol/model/ElicitationAction$Accept : com/agentclientprotocol/model/ElicitationAction { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationAction$Accept$Companion; + public fun ()V + public fun (Ljava/util/Map;)V + public synthetic fun (Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/Map; + public final fun copy (Ljava/util/Map;)Lcom/agentclientprotocol/model/ElicitationAction$Accept; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationAction$Accept;Ljava/util/Map;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationAction$Accept; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Ljava/util/Map; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationAction$Accept$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationAction$Accept$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationAction$Accept; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationAction$Accept;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationAction$Accept$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationAction$Cancel : com/agentclientprotocol/model/ElicitationAction { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationAction$Cancel; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationAction$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationAction$Decline : com/agentclientprotocol/model/ElicitationAction { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationAction$Decline; + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I + public final fun serializer ()Lkotlinx/serialization/KSerializer; + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationCapabilities : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationCapabilities$Companion; + public fun ()V + public fun (Lcom/agentclientprotocol/model/ElicitationFormCapabilities;Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationFormCapabilities;Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationFormCapabilities; + public final fun component2 ()Lcom/agentclientprotocol/model/ElicitationUrlCapabilities; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationFormCapabilities;Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ElicitationCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationCapabilities;Lcom/agentclientprotocol/model/ElicitationFormCapabilities;Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationCapabilities; + public fun equals (Ljava/lang/Object;)Z + public final fun getForm ()Lcom/agentclientprotocol/model/ElicitationFormCapabilities; + public final fun getSupportsForm ()Z + public final fun getSupportsUrl ()Z + public final fun getUrl ()Lcom/agentclientprotocol/model/ElicitationUrlCapabilities; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationCapabilities; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationCapabilities;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationCapabilities$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class com/agentclientprotocol/model/ElicitationContentValue { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationContentValue$Companion; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$BooleanValue : com/agentclientprotocol/model/ElicitationContentValue { + public fun (Z)V + public final fun component1 ()Z + public final fun copy (Z)Lcom/agentclientprotocol/model/ElicitationContentValue$BooleanValue; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationContentValue$BooleanValue;ZILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationContentValue$BooleanValue; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()Z + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$IntegerValue : com/agentclientprotocol/model/ElicitationContentValue { + public fun (J)V + public final fun component1 ()J + public final fun copy (J)Lcom/agentclientprotocol/model/ElicitationContentValue$IntegerValue; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationContentValue$IntegerValue;JILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationContentValue$IntegerValue; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()J + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$NumberValue : com/agentclientprotocol/model/ElicitationContentValue { + public fun (D)V + public final fun component1 ()D + public final fun copy (D)Lcom/agentclientprotocol/model/ElicitationContentValue$NumberValue; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationContentValue$NumberValue;DILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationContentValue$NumberValue; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()D + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$StringArrayValue : com/agentclientprotocol/model/ElicitationContentValue { + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/agentclientprotocol/model/ElicitationContentValue$StringArrayValue; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationContentValue$StringArrayValue;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationContentValue$StringArrayValue; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationContentValue$StringValue : com/agentclientprotocol/model/ElicitationContentValue { + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationContentValue$StringValue; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationContentValue$StringValue;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationContentValue$StringValue; + public fun equals (Ljava/lang/Object;)Z + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationFormCapabilities : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationFormCapabilities$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ElicitationFormCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationFormCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationFormCapabilities; + public fun equals (Ljava/lang/Object;)Z + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationFormCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationFormCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationFormCapabilities; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationFormCapabilities;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationFormCapabilities$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationId { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationId$Companion; + public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationId; + public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public static fun hashCode-impl (Ljava/lang/String;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationId$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationId$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-lvk1YYk (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/String; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-gzpmA1Y (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationId$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationKt { + public static final field URL_ELICITATION_REQUIRED_ERROR_CODE I +} + +public abstract class com/agentclientprotocol/model/ElicitationMode { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationMode$Companion; + public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/ElicitationMode;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class com/agentclientprotocol/model/ElicitationMode$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationMode$Form : com/agentclientprotocol/model/ElicitationMode { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationMode$Form$Companion; + public fun (Lcom/agentclientprotocol/model/ElicitationSchema;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationSchema; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationSchema;)Lcom/agentclientprotocol/model/ElicitationMode$Form; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationMode$Form;Lcom/agentclientprotocol/model/ElicitationSchema;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationMode$Form; + public fun equals (Ljava/lang/Object;)Z + public final fun getRequestedSchema ()Lcom/agentclientprotocol/model/ElicitationSchema; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationMode$Form$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationMode$Form$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationMode$Form; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationMode$Form;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationMode$Form$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationMode$Url : com/agentclientprotocol/model/ElicitationMode { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationMode$Url$Companion; + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-WWIfWFI ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy-hBnOb4M (Ljava/lang/String;Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationMode$Url; + public static synthetic fun copy-hBnOb4M$default (Lcom/agentclientprotocol/model/ElicitationMode$Url;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationMode$Url; + public fun equals (Ljava/lang/Object;)Z + public final fun getElicitationId-WWIfWFI ()Ljava/lang/String; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationMode$Url$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationMode$Url$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationMode$Url; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationMode$Url;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationMode$Url$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$Companion; + public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/ElicitationPropertySchema;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty : com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Lcom/agentclientprotocol/model/MultiSelectItems; + public final fun component6 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/util/List; + public final fun getDescription ()Ljava/lang/String; + public final fun getItems ()Lcom/agentclientprotocol/model/MultiSelectItems; + public final fun getMaxItems ()Ljava/lang/Long; + public final fun getMinItems ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$ArrayProperty$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty : com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Boolean; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Boolean; + public final fun getDescription ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$BooleanProperty$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty : com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Long; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Long; + public final fun getMinimum ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$IntegerProperty$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty : com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Double; + public final fun component4 ()Ljava/lang/Double; + public final fun component5 ()Ljava/lang/Double; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Double; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Double; + public final fun getMinimum ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$NumberProperty$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$StringProperty : com/agentclientprotocol/model/ElicitationPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/agentclientprotocol/model/StringFormat; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/util/List; + public final fun component9 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getEnumValues ()Ljava/util/List; + public final fun getFormat ()Lcom/agentclientprotocol/model/StringFormat; + public final fun getMaxLength ()Ljava/lang/Integer; + public final fun getMinLength ()Ljava/lang/Integer; + public final fun getOneOf ()Ljava/util/List; + public final fun getPattern ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationPropertySchema$StringProperty$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationPropertySchema$StringProperty;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationPropertySchema$StringProperty$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationSchema { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationSchema$Companion; + public fun ()V + public fun (Lcom/agentclientprotocol/model/ElicitationSchemaType;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/lang/String;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationSchemaType;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationSchemaType; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/util/Map; + public final fun component4 ()Ljava/util/List; + public final fun component5 ()Ljava/lang/String; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationSchemaType;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationSchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationSchema;Lcom/agentclientprotocol/model/ElicitationSchemaType;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationSchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDescription ()Ljava/lang/String; + public final fun getProperties ()Ljava/util/Map; + public final fun getRequired ()Ljava/util/List; + public final fun getTitle ()Ljava/lang/String; + public final fun getType ()Lcom/agentclientprotocol/model/ElicitationSchemaType; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/ElicitationSchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationSchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationSchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationSchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationSchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationSchemaType : java/lang/Enum { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationSchemaType$Companion; + public static final field OBJECT Lcom/agentclientprotocol/model/ElicitationSchemaType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationSchemaType; + public static fun values ()[Lcom/agentclientprotocol/model/ElicitationSchemaType; +} + +public final class com/agentclientprotocol/model/ElicitationSchemaType$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract class com/agentclientprotocol/model/ElicitationScope { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationScope$Companion; +} + +public final class com/agentclientprotocol/model/ElicitationScope$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/DidOpenDocumentNotification : com/agentclientprotocol/model/AcpNotification, com/agentclientprotocol/model/AcpWithSessionId { - public static final field Companion Lcom/agentclientprotocol/model/DidOpenDocumentNotification$Companion; - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +public final class com/agentclientprotocol/model/ElicitationScope$Request : com/agentclientprotocol/model/ElicitationScope { + public fun (Lcom/agentclientprotocol/rpc/RequestId;)V + public final fun component1 ()Lcom/agentclientprotocol/rpc/RequestId; + public final fun copy (Lcom/agentclientprotocol/rpc/RequestId;)Lcom/agentclientprotocol/model/ElicitationScope$Request; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationScope$Request;Lcom/agentclientprotocol/rpc/RequestId;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationScope$Request; + public fun equals (Ljava/lang/Object;)Z + public final fun getRequestId ()Lcom/agentclientprotocol/rpc/RequestId; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/ElicitationScope$Session : com/agentclientprotocol/model/ElicitationScope { + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1-7EW-EgU ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()J - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy-PBEKwEQ (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; - public static synthetic fun copy-PBEKwEQ$default (Lcom/agentclientprotocol/model/DidOpenDocumentNotification;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; + public final fun component2-6c_jIZA ()Ljava/lang/String; + public final fun copy-nfK0P_c (Ljava/lang/String;Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationScope$Session; + public static synthetic fun copy-nfK0P_c$default (Lcom/agentclientprotocol/model/ElicitationScope$Session;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationScope$Session; public fun equals (Ljava/lang/Object;)Z - public final fun getLanguageId ()Ljava/lang/String; - public fun getSessionId-7EW-EgU ()Ljava/lang/String; - public final fun getText ()Ljava/lang/String; - public final fun getUri ()Ljava/lang/String; - public final fun getVersion ()J - public fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public final fun getSessionId-7EW-EgU ()Ljava/lang/String; + public final fun getToolCallId-6c_jIZA ()Ljava/lang/String; public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public final synthetic class com/agentclientprotocol/model/DidOpenDocumentNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lcom/agentclientprotocol/model/DidOpenDocumentNotification$$serializer; - public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/DidOpenDocumentNotification; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/DidOpenDocumentNotification;)V - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +public final class com/agentclientprotocol/model/ElicitationStringType : java/lang/Enum { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationStringType$Companion; + public static final field STRING Lcom/agentclientprotocol/model/ElicitationStringType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationStringType; + public static fun values ()[Lcom/agentclientprotocol/model/ElicitationStringType; } -public final class com/agentclientprotocol/model/DidOpenDocumentNotification$Companion { +public final class com/agentclientprotocol/model/ElicitationStringType$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/DidSaveDocumentNotification : com/agentclientprotocol/model/AcpNotification, com/agentclientprotocol/model/AcpWithSessionId { - public static final field Companion Lcom/agentclientprotocol/model/DidSaveDocumentNotification$Companion; - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-7EW-EgU ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy-nk3TnMc (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; - public static synthetic fun copy-nk3TnMc$default (Lcom/agentclientprotocol/model/DidSaveDocumentNotification;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; +public final class com/agentclientprotocol/model/ElicitationUrlCapabilities : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationUrlCapabilities$Companion; + public fun ()V + public fun (Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ElicitationUrlCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ElicitationUrlCapabilities; public fun equals (Ljava/lang/Object;)Z - public fun getSessionId-7EW-EgU ()Ljava/lang/String; - public final fun getUri ()Ljava/lang/String; public fun get_meta ()Lkotlinx/serialization/json/JsonElement; public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public final synthetic class com/agentclientprotocol/model/DidSaveDocumentNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lcom/agentclientprotocol/model/DidSaveDocumentNotification$$serializer; +public final synthetic class com/agentclientprotocol/model/ElicitationUrlCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/ElicitationUrlCapabilities$$serializer; public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/DidSaveDocumentNotification; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/ElicitationUrlCapabilities; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/DidSaveDocumentNotification;)V + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/ElicitationUrlCapabilities;)V public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/DidSaveDocumentNotification$Companion { +public final class com/agentclientprotocol/model/ElicitationUrlCapabilities$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/ElicitationUrlOnlyMode : java/lang/Enum { + public static final field Companion Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode$Companion; + public static final field URL Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode; + public static fun values ()[Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode; +} + +public final class com/agentclientprotocol/model/ElicitationUrlOnlyMode$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } @@ -1571,6 +2303,35 @@ public final class com/agentclientprotocol/model/EmbeddedResourceResource$TextRe public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/EnumOption { + public static final field Companion Lcom/agentclientprotocol/model/EnumOption$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;Ljava/lang/String;)Lcom/agentclientprotocol/model/EnumOption; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/EnumOption;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/EnumOption; + public fun equals (Ljava/lang/Object;)Z + public final fun getTitle ()Ljava/lang/String; + public final fun getValue ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/EnumOption$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/EnumOption$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/EnumOption; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/EnumOption;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/EnumOption$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/EnvVariable : com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/EnvVariable$Companion; public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V @@ -1844,6 +2605,43 @@ public final class com/agentclientprotocol/model/InitializeResponse$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/IntegerPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/IntegerPropertySchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;)Lcom/agentclientprotocol/model/IntegerPropertySchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/IntegerPropertySchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;ILjava/lang/Object;)Lcom/agentclientprotocol/model/IntegerPropertySchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Long; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Long; + public final fun getMinimum ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/IntegerPropertySchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/IntegerPropertySchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/IntegerPropertySchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/IntegerPropertySchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/IntegerPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/KillTerminalCommandRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/KillTerminalCommandRequest$Companion; public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -2364,6 +3162,74 @@ public final class com/agentclientprotocol/model/ModelInfo$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public abstract class com/agentclientprotocol/model/MultiSelectItems { + public static final field Companion Lcom/agentclientprotocol/model/MultiSelectItems$Companion; +} + +public final class com/agentclientprotocol/model/MultiSelectItems$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/MultiSelectItems$Titled : com/agentclientprotocol/model/MultiSelectItems { + public fun (Lcom/agentclientprotocol/model/TitledMultiSelectItems;)V + public final fun component1 ()Lcom/agentclientprotocol/model/TitledMultiSelectItems; + public final fun copy (Lcom/agentclientprotocol/model/TitledMultiSelectItems;)Lcom/agentclientprotocol/model/MultiSelectItems$Titled; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/MultiSelectItems$Titled;Lcom/agentclientprotocol/model/TitledMultiSelectItems;ILjava/lang/Object;)Lcom/agentclientprotocol/model/MultiSelectItems$Titled; + public fun equals (Ljava/lang/Object;)Z + public final fun getItems ()Lcom/agentclientprotocol/model/TitledMultiSelectItems; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/MultiSelectItems$Untitled : com/agentclientprotocol/model/MultiSelectItems { + public fun (Lcom/agentclientprotocol/model/UntitledMultiSelectItems;)V + public final fun component1 ()Lcom/agentclientprotocol/model/UntitledMultiSelectItems; + public final fun copy (Lcom/agentclientprotocol/model/UntitledMultiSelectItems;)Lcom/agentclientprotocol/model/MultiSelectItems$Untitled; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/MultiSelectItems$Untitled;Lcom/agentclientprotocol/model/UntitledMultiSelectItems;ILjava/lang/Object;)Lcom/agentclientprotocol/model/MultiSelectItems$Untitled; + public fun equals (Ljava/lang/Object;)Z + public final fun getItems ()Lcom/agentclientprotocol/model/UntitledMultiSelectItems; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class com/agentclientprotocol/model/MultiSelectPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/MultiSelectPropertySchema$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Long; + public final fun component4 ()Ljava/lang/Long; + public final fun component5 ()Lcom/agentclientprotocol/model/MultiSelectItems; + public final fun component6 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;)Lcom/agentclientprotocol/model/MultiSelectPropertySchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/MultiSelectPropertySchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lcom/agentclientprotocol/model/MultiSelectItems;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/MultiSelectPropertySchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/util/List; + public final fun getDescription ()Ljava/lang/String; + public final fun getItems ()Lcom/agentclientprotocol/model/MultiSelectItems; + public final fun getMaxItems ()Ljava/lang/Long; + public final fun getMinItems ()Ljava/lang/Long; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/MultiSelectPropertySchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/MultiSelectPropertySchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/MultiSelectPropertySchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/MultiSelectPropertySchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/MultiSelectPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/NesCapabilities : com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/NesCapabilities$Companion; public fun ()V @@ -3559,6 +4425,43 @@ public final class com/agentclientprotocol/model/NewSessionResponse$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/NumberPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/NumberPropertySchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Double; + public final fun component4 ()Ljava/lang/Double; + public final fun component5 ()Ljava/lang/Double; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;)Lcom/agentclientprotocol/model/NumberPropertySchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/NumberPropertySchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Double;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lcom/agentclientprotocol/model/NumberPropertySchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/Double; + public final fun getDescription ()Ljava/lang/String; + public final fun getMaximum ()Ljava/lang/Double; + public final fun getMinimum ()Ljava/lang/Double; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/NumberPropertySchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/NumberPropertySchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/NumberPropertySchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/NumberPropertySchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/NumberPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/PermissionOption : com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/PermissionOption$Companion; public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/PermissionOptionKind;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5659,6 +6562,66 @@ public final class com/agentclientprotocol/model/StopReason$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/StringFormat : java/lang/Enum { + public static final field Companion Lcom/agentclientprotocol/model/StringFormat$Companion; + public static final field DATE Lcom/agentclientprotocol/model/StringFormat; + public static final field DATE_TIME Lcom/agentclientprotocol/model/StringFormat; + public static final field EMAIL Lcom/agentclientprotocol/model/StringFormat; + public static final field URI Lcom/agentclientprotocol/model/StringFormat; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lcom/agentclientprotocol/model/StringFormat; + public static fun values ()[Lcom/agentclientprotocol/model/StringFormat; +} + +public final class com/agentclientprotocol/model/StringFormat$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/StringPropertySchema { + public static final field Companion Lcom/agentclientprotocol/model/StringPropertySchema$Companion; + public fun ()V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/Integer; + public final fun component4 ()Ljava/lang/Integer; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Lcom/agentclientprotocol/model/StringFormat; + public final fun component7 ()Ljava/lang/String; + public final fun component8 ()Ljava/util/List; + public final fun component9 ()Ljava/util/List; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lcom/agentclientprotocol/model/StringPropertySchema; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/StringPropertySchema;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Lcom/agentclientprotocol/model/StringFormat;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/StringPropertySchema; + public fun equals (Ljava/lang/Object;)Z + public final fun getDefault ()Ljava/lang/String; + public final fun getDescription ()Ljava/lang/String; + public final fun getEnumValues ()Ljava/util/List; + public final fun getFormat ()Lcom/agentclientprotocol/model/StringFormat; + public final fun getMaxLength ()Ljava/lang/Integer; + public final fun getMinLength ()Ljava/lang/Integer; + public final fun getOneOf ()Ljava/util/List; + public final fun getPattern ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/StringPropertySchema$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/StringPropertySchema$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/StringPropertySchema; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/StringPropertySchema;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/StringPropertySchema$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/SuggestNesRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/SuggestNesRequest$Companion; public synthetic fun (Ljava/lang/String;Ljava/lang/String;JLcom/agentclientprotocol/model/NesPosition;Lcom/agentclientprotocol/model/NesRange;Lcom/agentclientprotocol/model/NesTriggerKind;Lcom/agentclientprotocol/model/NesSuggestContext;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -5872,6 +6835,33 @@ public final class com/agentclientprotocol/model/TextDocumentSyncKind$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/TitledMultiSelectItems { + public static final field Companion Lcom/agentclientprotocol/model/TitledMultiSelectItems$Companion; + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/agentclientprotocol/model/TitledMultiSelectItems; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/TitledMultiSelectItems;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/TitledMultiSelectItems; + public fun equals (Ljava/lang/Object;)Z + public final fun getOptions ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/TitledMultiSelectItems$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/TitledMultiSelectItems$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/TitledMultiSelectItems; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/TitledMultiSelectItems;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/TitledMultiSelectItems$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract class com/agentclientprotocol/model/ToolCallContent { public static final field Companion Lcom/agentclientprotocol/model/ToolCallContent$Companion; public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V @@ -6076,6 +7066,97 @@ public final class com/agentclientprotocol/model/TypesKt { public static final fun getSUPPORTED_PROTOCOL_VERSIONS ()[Ljava/lang/Integer; } +public final class com/agentclientprotocol/model/UntitledMultiSelectItems { + public static final field Companion Lcom/agentclientprotocol/model/UntitledMultiSelectItems$Companion; + public fun (Lcom/agentclientprotocol/model/ElicitationStringType;Ljava/util/List;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationStringType;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationStringType; + public final fun component2 ()Ljava/util/List; + public final fun copy (Lcom/agentclientprotocol/model/ElicitationStringType;Ljava/util/List;)Lcom/agentclientprotocol/model/UntitledMultiSelectItems; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/UntitledMultiSelectItems;Lcom/agentclientprotocol/model/ElicitationStringType;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/UntitledMultiSelectItems; + public fun equals (Ljava/lang/Object;)Z + public final fun getType ()Lcom/agentclientprotocol/model/ElicitationStringType; + public final fun getValues ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/UntitledMultiSelectItems$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/UntitledMultiSelectItems$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/UntitledMultiSelectItems; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/UntitledMultiSelectItems;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/UntitledMultiSelectItems$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/UrlElicitationRequiredData { + public static final field Companion Lcom/agentclientprotocol/model/UrlElicitationRequiredData$Companion; + public fun (Ljava/util/List;)V + public final fun component1 ()Ljava/util/List; + public final fun copy (Ljava/util/List;)Lcom/agentclientprotocol/model/UrlElicitationRequiredData; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/UrlElicitationRequiredData;Ljava/util/List;ILjava/lang/Object;)Lcom/agentclientprotocol/model/UrlElicitationRequiredData; + public fun equals (Ljava/lang/Object;)Z + public final fun getElicitations ()Ljava/util/List; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/UrlElicitationRequiredData$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/UrlElicitationRequiredData$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/UrlElicitationRequiredData; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/UrlElicitationRequiredData;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/UrlElicitationRequiredData$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/UrlElicitationRequiredItem { + public static final field Companion Lcom/agentclientprotocol/model/UrlElicitationRequiredItem$Companion; + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode; + public final fun component2-WWIfWFI ()Ljava/lang/String; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun copy-6TTUXXo (Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/agentclientprotocol/model/UrlElicitationRequiredItem; + public static synthetic fun copy-6TTUXXo$default (Lcom/agentclientprotocol/model/UrlElicitationRequiredItem;Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/UrlElicitationRequiredItem; + public fun equals (Ljava/lang/Object;)Z + public final fun getElicitationId-WWIfWFI ()Ljava/lang/String; + public final fun getMessage ()Ljava/lang/String; + public final fun getMode ()Lcom/agentclientprotocol/model/ElicitationUrlOnlyMode; + public final fun getUrl ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class com/agentclientprotocol/model/UrlElicitationRequiredItem$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/UrlElicitationRequiredItem$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/UrlElicitationRequiredItem; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/UrlElicitationRequiredItem;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/UrlElicitationRequiredItem$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/WaitForTerminalExitRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/WaitForTerminalExitRequest$Companion; public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt index a92194c..7042ba1 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt @@ -73,6 +73,8 @@ public data class ClientCapabilities( val nes: ClientNesCapabilities? = null, @property:UnstableApi val positionEncodings: List? = null, + @property:UnstableApi + val elicitation: ElicitationCapabilities? = null, override val _meta: JsonElement? = null ) : AcpCapabilities, AcpWithMeta diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Elicitation.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Elicitation.kt new file mode 100644 index 0000000..6cd3a9c --- /dev/null +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Elicitation.kt @@ -0,0 +1,719 @@ +@file:Suppress("unused") +@file:OptIn(ExperimentalSerializationApi::class) + +package com.agentclientprotocol.model + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.rpc.RequestId +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.InternalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerializationException +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.MapSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonClassDiscriminator +import kotlinx.serialization.json.JsonDecoder +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonEncoder +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.boolean +import kotlinx.serialization.json.booleanOrNull +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.double +import kotlinx.serialization.json.doubleOrNull +import kotlinx.serialization.json.int +import kotlinx.serialization.json.intOrNull +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.long +import kotlinx.serialization.json.longOrNull +import kotlinx.serialization.json.put +import kotlin.jvm.JvmInline + +// === Error Code === + +/** + * Error code for URL elicitation required errors. + */ +@UnstableApi +public const val URL_ELICITATION_REQUIRED_ERROR_CODE: Int = -32042 + +// === Value Types === + +/** + * **UNSTABLE** + * + * Unique identifier for an elicitation. + */ +@UnstableApi +@JvmInline +@Serializable +public value class ElicitationId(public val value: String) { + override fun toString(): String = value +} + +// === Enums === + +/** + * String format types for string properties in elicitation schemas. + */ +@UnstableApi +@Serializable +public enum class StringFormat { + @SerialName("email") EMAIL, + @SerialName("uri") URI, + @SerialName("date") DATE, + @SerialName("date-time") DATE_TIME +} + +/** + * Type discriminator for elicitation schemas. Always "object". + */ +@UnstableApi +@Serializable +public enum class ElicitationSchemaType { + @SerialName("object") OBJECT +} + +/** + * Type discriminator for URL-only elicitation error items. + */ +@UnstableApi +@Serializable +public enum class ElicitationUrlOnlyMode { + @SerialName("url") URL +} + +// === Property Schemas === + +/** + * A titled enum option with a const value and human-readable title. + */ +@UnstableApi +@Serializable +public data class EnumOption( + @SerialName("const") val value: String, + val title: String +) + +/** + * Schema for string properties in an elicitation form. + */ +@UnstableApi +@Serializable +public data class StringPropertySchema( + val title: String? = null, + val description: String? = null, + val minLength: Int? = null, + val maxLength: Int? = null, + val pattern: String? = null, + val format: StringFormat? = null, + val default: String? = null, + @SerialName("enum") val enumValues: List? = null, + @SerialName("oneOf") val oneOf: List? = null +) + +/** + * Schema for number (floating-point) properties in an elicitation form. + */ +@UnstableApi +@Serializable +public data class NumberPropertySchema( + val title: String? = null, + val description: String? = null, + val minimum: Double? = null, + val maximum: Double? = null, + val default: Double? = null +) + +/** + * Schema for integer properties in an elicitation form. + */ +@UnstableApi +@Serializable +public data class IntegerPropertySchema( + val title: String? = null, + val description: String? = null, + val minimum: Long? = null, + val maximum: Long? = null, + val default: Long? = null +) + +/** + * Schema for boolean properties in an elicitation form. + */ +@UnstableApi +@Serializable +public data class BooleanPropertySchema( + val title: String? = null, + val description: String? = null, + val default: Boolean? = null +) + +// === Multi-Select Items === + +/** + * Type discriminator for string items in multi-select. Always "string". + */ +@UnstableApi +@Serializable +public enum class ElicitationStringType { + @SerialName("string") STRING +} + +/** + * Items definition for untitled multi-select enum properties. + */ +@UnstableApi +@Serializable +public data class UntitledMultiSelectItems( + @SerialName("type") val type: ElicitationStringType = ElicitationStringType.STRING, + @SerialName("enum") val values: List +) + +/** + * Items definition for titled multi-select enum properties. + */ +@UnstableApi +@Serializable +public data class TitledMultiSelectItems( + @SerialName("anyOf") val options: List +) + +/** + * Items for a multi-select (array) property schema. + * Untagged: distinguished by field presence ("enum" for Untitled, "anyOf" for Titled). + */ +@UnstableApi +@Serializable(with = MultiSelectItemsSerializer::class) +public sealed class MultiSelectItems { + public data class Untitled(val items: UntitledMultiSelectItems) : MultiSelectItems() + public data class Titled(val items: TitledMultiSelectItems) : MultiSelectItems() +} + +@OptIn(UnstableApi::class) +internal object MultiSelectItemsSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MultiSelectItems") + + override fun serialize(encoder: Encoder, value: MultiSelectItems) { + val jsonEncoder = encoder as? JsonEncoder + ?: throw SerializationException("MultiSelectItemsSerializer supports only JSON") + val json = jsonEncoder.json + val element = when (value) { + is MultiSelectItems.Untitled -> json.encodeToJsonElement(UntitledMultiSelectItems.serializer(), value.items) + is MultiSelectItems.Titled -> json.encodeToJsonElement(TitledMultiSelectItems.serializer(), value.items) + } + jsonEncoder.encodeJsonElement(element) + } + + override fun deserialize(decoder: Decoder): MultiSelectItems { + val jsonDecoder = decoder as? JsonDecoder + ?: throw SerializationException("MultiSelectItemsSerializer supports only JSON") + val json = jsonDecoder.json + val element = jsonDecoder.decodeJsonElement().jsonObject + + return if ("anyOf" in element) { + MultiSelectItems.Titled(json.decodeFromJsonElement(TitledMultiSelectItems.serializer(), JsonObject(element))) + } else { + MultiSelectItems.Untitled(json.decodeFromJsonElement(UntitledMultiSelectItems.serializer(), JsonObject(element))) + } + } +} + +/** + * Schema for multi-select (array) properties in an elicitation form. + */ +@UnstableApi +@Serializable +public data class MultiSelectPropertySchema( + val title: String? = null, + val description: String? = null, + val minItems: Long? = null, + val maxItems: Long? = null, + val items: MultiSelectItems, + val default: List? = null +) + +// === Property Schema (Tagged Union) === + +/** + * Property schema for elicitation form fields. + * Each variant corresponds to a JSON Schema "type" value. + */ +@UnstableApi +@Serializable +@JsonClassDiscriminator("type") +public sealed class ElicitationPropertySchema { + @Serializable + @SerialName("string") + public data class StringProperty( + val title: String? = null, + val description: String? = null, + val minLength: Int? = null, + val maxLength: Int? = null, + val pattern: String? = null, + val format: StringFormat? = null, + val default: String? = null, + @SerialName("enum") val enumValues: List? = null, + @SerialName("oneOf") val oneOf: List? = null + ) : ElicitationPropertySchema() + + @Serializable + @SerialName("number") + public data class NumberProperty( + val title: String? = null, + val description: String? = null, + val minimum: Double? = null, + val maximum: Double? = null, + val default: Double? = null + ) : ElicitationPropertySchema() + + @Serializable + @SerialName("integer") + public data class IntegerProperty( + val title: String? = null, + val description: String? = null, + val minimum: Long? = null, + val maximum: Long? = null, + val default: Long? = null + ) : ElicitationPropertySchema() + + @Serializable + @SerialName("boolean") + public data class BooleanProperty( + val title: String? = null, + val description: String? = null, + val default: Boolean? = null + ) : ElicitationPropertySchema() + + @Serializable + @SerialName("array") + public data class ArrayProperty( + val title: String? = null, + val description: String? = null, + val minItems: Long? = null, + val maxItems: Long? = null, + val items: MultiSelectItems, + val default: List? = null + ) : ElicitationPropertySchema() +} + +// === Elicitation Schema === + +/** + * Type-safe elicitation schema for requesting structured user input. + */ +@UnstableApi +@Serializable +public data class ElicitationSchema( + @SerialName("type") @EncodeDefault val type: ElicitationSchemaType = ElicitationSchemaType.OBJECT, + val title: String? = null, + val properties: Map = emptyMap(), + val required: List? = null, + val description: String? = null +) + +// === Elicitation Scope (Untagged) === + +/** + * The scope of an elicitation request, determining what context it's tied to. + */ +@UnstableApi +@Serializable(with = ElicitationScopeSerializer::class) +public sealed class ElicitationScope { + public data class Session( + val sessionId: SessionId, + val toolCallId: ToolCallId? = null + ) : ElicitationScope() + + public data class Request( + val requestId: RequestId + ) : ElicitationScope() +} + +@OptIn(UnstableApi::class) +internal object ElicitationScopeSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ElicitationScope") + + override fun serialize(encoder: Encoder, value: ElicitationScope) { + val jsonEncoder = encoder as? JsonEncoder + ?: throw SerializationException("ElicitationScopeSerializer supports only JSON") + val json = jsonEncoder.json + val element = when (value) { + is ElicitationScope.Session -> buildJsonObject { + put("sessionId", value.sessionId.value) + if (value.toolCallId != null) { + put("toolCallId", value.toolCallId.value) + } + } + is ElicitationScope.Request -> buildJsonObject { + put("requestId", json.encodeToJsonElement(RequestId.serializer(), value.requestId)) + } + } + jsonEncoder.encodeJsonElement(element) + } + + override fun deserialize(decoder: Decoder): ElicitationScope { + val jsonDecoder = decoder as? JsonDecoder + ?: throw SerializationException("ElicitationScopeSerializer supports only JSON") + val json = jsonDecoder.json + val element = jsonDecoder.decodeJsonElement().jsonObject + + val hasSessionId = "sessionId" in element + val hasRequestId = "requestId" in element + if (hasSessionId && hasRequestId) { + throw SerializationException("ElicitationScope must have either 'sessionId' or 'requestId', not both") + } + return if (hasSessionId) { + val sessionId = SessionId(element["sessionId"]!!.jsonPrimitive.content) + val toolCallId = element["toolCallId"]?.let { ToolCallId(it.jsonPrimitive.content) } + ElicitationScope.Session(sessionId, toolCallId) + } else if (hasRequestId) { + val requestId = json.decodeFromJsonElement(RequestId.serializer(), element["requestId"]!!) + ElicitationScope.Request(requestId) + } else { + throw SerializationException("ElicitationScope must have either 'sessionId' or 'requestId'") + } + } +} + +// === Elicitation Mode (Tagged by "mode") === + +/** + * The mode of elicitation, determining how user input is collected. + */ +@UnstableApi +@Serializable +@JsonClassDiscriminator("mode") +public sealed class ElicitationMode { + @Serializable + @SerialName("form") + public data class Form( + val requestedSchema: ElicitationSchema + ) : ElicitationMode() + + @Serializable + @SerialName("url") + public data class Url( + val elicitationId: ElicitationId, + val url: String + ) : ElicitationMode() +} + +// === Create Elicitation Request (Flattened) === + +/** + * Request from the agent to elicit structured user input. + */ +@UnstableApi +@Serializable(with = CreateElicitationRequestSerializer::class) +public data class CreateElicitationRequest( + val scope: ElicitationScope, + val mode: ElicitationMode, + val message: String, + override val _meta: JsonElement? = null +) : AcpRequest + +@OptIn(UnstableApi::class) +internal object CreateElicitationRequestSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("CreateElicitationRequest") + + override fun serialize(encoder: Encoder, value: CreateElicitationRequest) { + val jsonEncoder = encoder as? JsonEncoder + ?: throw SerializationException("CreateElicitationRequestSerializer supports only JSON") + val json = jsonEncoder.json + + val scopeElement = json.encodeToJsonElement(ElicitationScopeSerializer, value.scope).jsonObject + val modeElement = json.encodeToJsonElement(ElicitationMode.serializer(), value.mode).jsonObject + + val element = buildJsonObject { + // Flatten scope fields + for ((key, v) in scopeElement) { + put(key, v) + } + // Flatten mode fields + for ((key, v) in modeElement) { + put(key, v) + } + put("message", value.message) + if (value._meta != null) { + put("_meta", value._meta) + } + } + jsonEncoder.encodeJsonElement(element) + } + + override fun deserialize(decoder: Decoder): CreateElicitationRequest { + val jsonDecoder = decoder as? JsonDecoder + ?: throw SerializationException("CreateElicitationRequestSerializer supports only JSON") + val json = jsonDecoder.json + val jsonObject = jsonDecoder.decodeJsonElement().jsonObject + + // Deserialize scope — the two variants are mutually exclusive per the RFD + val hasSessionId = "sessionId" in jsonObject + val hasRequestId = "requestId" in jsonObject + if (hasSessionId && hasRequestId) { + throw SerializationException("CreateElicitationRequest must have either 'sessionId' or 'requestId', not both") + } + val scope = if (hasSessionId) { + val sessionId = SessionId(jsonObject["sessionId"]!!.jsonPrimitive.content) + val toolCallId = jsonObject["toolCallId"]?.let { ToolCallId(it.jsonPrimitive.content) } + ElicitationScope.Session(sessionId, toolCallId) + } else if (hasRequestId) { + val requestId = json.decodeFromJsonElement(RequestId.serializer(), jsonObject["requestId"]!!) + ElicitationScope.Request(requestId) + } else { + throw SerializationException("CreateElicitationRequest must have either 'sessionId' or 'requestId'") + } + + // Deserialize mode + val modeStr = jsonObject["mode"]?.jsonPrimitive?.content + ?: throw SerializationException("Missing 'mode' field") + val mode = when (modeStr) { + "form" -> { + val requestedSchema = json.decodeFromJsonElement(ElicitationSchema.serializer(), jsonObject["requestedSchema"] + ?: throw SerializationException("Missing 'requestedSchema' for form mode")) + ElicitationMode.Form(requestedSchema) + } + "url" -> { + val elicitationId = ElicitationId(jsonObject["elicitationId"]?.jsonPrimitive?.content + ?: throw SerializationException("Missing 'elicitationId' for url mode")) + val url = jsonObject["url"]?.jsonPrimitive?.content + ?: throw SerializationException("Missing 'url' for url mode") + ElicitationMode.Url(elicitationId, url) + } + else -> throw SerializationException("Unknown elicitation mode: $modeStr") + } + + val message = jsonObject["message"]?.jsonPrimitive?.content + ?: throw SerializationException("Missing 'message'") + val meta = jsonObject["_meta"] + + return CreateElicitationRequest(scope, mode, message, meta) + } +} + +// === Elicitation Content Value (Untagged) === + +/** + * A value in elicitation response content. Can be string, integer, number, boolean, or string array. + */ +@UnstableApi +@Serializable(with = ElicitationContentValueSerializer::class) +public sealed class ElicitationContentValue { + public data class StringValue(val value: String) : ElicitationContentValue() + public data class IntegerValue(val value: Long) : ElicitationContentValue() + public data class NumberValue(val value: Double) : ElicitationContentValue() + public data class BooleanValue(val value: Boolean) : ElicitationContentValue() + public data class StringArrayValue(val value: List) : ElicitationContentValue() +} + +@OptIn(UnstableApi::class) +internal object ElicitationContentValueSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ElicitationContentValue") + + override fun serialize(encoder: Encoder, value: ElicitationContentValue) { + val jsonEncoder = encoder as? JsonEncoder + ?: throw SerializationException("ElicitationContentValueSerializer supports only JSON") + when (value) { + is ElicitationContentValue.StringValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value)) + is ElicitationContentValue.IntegerValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value)) + is ElicitationContentValue.NumberValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value)) + is ElicitationContentValue.BooleanValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value)) + is ElicitationContentValue.StringArrayValue -> { + val array = JsonArray(value.value.map { JsonPrimitive(it) }) + jsonEncoder.encodeJsonElement(array) + } + } + } + + override fun deserialize(decoder: Decoder): ElicitationContentValue { + val jsonDecoder = decoder as? JsonDecoder + ?: throw SerializationException("ElicitationContentValueSerializer supports only JSON") + val element = jsonDecoder.decodeJsonElement() + + return when (element) { + is JsonPrimitive -> when { + element.isString -> ElicitationContentValue.StringValue(element.content) + element.booleanOrNull != null -> ElicitationContentValue.BooleanValue(element.boolean) + element.longOrNull != null -> ElicitationContentValue.IntegerValue(element.long) + element.doubleOrNull != null -> ElicitationContentValue.NumberValue(element.double) + else -> throw SerializationException("Unsupported primitive type for ElicitationContentValue: $element") + } + is JsonArray -> { + val strings = element.map { + val primitive = it as? JsonPrimitive + ?: throw SerializationException("ElicitationContentValue StringArray items must be primitives, got: $it") + if (!primitive.isString) { + throw SerializationException("ElicitationContentValue StringArray items must be strings, got: $primitive") + } + primitive.content + } + ElicitationContentValue.StringArrayValue(strings) + } + else -> throw SerializationException("Unsupported JSON type for ElicitationContentValue: $element") + } + } +} + +// === Elicitation Action (Tagged by "action") === + +/** + * The user's action in response to an elicitation. + */ +@UnstableApi +@Serializable +@JsonClassDiscriminator("action") +public sealed class ElicitationAction { + @Serializable + @SerialName("accept") + public data class Accept( + val content: Map? = null + ) : ElicitationAction() + + @Serializable + @SerialName("decline") + public data object Decline : ElicitationAction() + + @Serializable + @SerialName("cancel") + public data object Cancel : ElicitationAction() +} + +// === Create Elicitation Response (Flattened) === + +/** + * Response from the client to an elicitation request. + */ +@UnstableApi +@Serializable(with = CreateElicitationResponseSerializer::class) +public data class CreateElicitationResponse( + val action: ElicitationAction, + override val _meta: JsonElement? = null +) : AcpResponse + +@OptIn(UnstableApi::class) +internal object CreateElicitationResponseSerializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("CreateElicitationResponse") + + override fun serialize(encoder: Encoder, value: CreateElicitationResponse) { + val jsonEncoder = encoder as? JsonEncoder + ?: throw SerializationException("CreateElicitationResponseSerializer supports only JSON") + val json = jsonEncoder.json + + val actionElement = json.encodeToJsonElement(ElicitationAction.serializer(), value.action).jsonObject + + val element = buildJsonObject { + for ((key, v) in actionElement) { + put(key, v) + } + if (value._meta != null) { + put("_meta", value._meta) + } + } + jsonEncoder.encodeJsonElement(element) + } + + override fun deserialize(decoder: Decoder): CreateElicitationResponse { + val jsonDecoder = decoder as? JsonDecoder + ?: throw SerializationException("CreateElicitationResponseSerializer supports only JSON") + val json = jsonDecoder.json + val jsonObject = jsonDecoder.decodeJsonElement().jsonObject + + val action = json.decodeFromJsonElement(ElicitationAction.serializer(), JsonObject(jsonObject)) + val meta = jsonObject["_meta"] + + return CreateElicitationResponse(action, meta) + } +} + +// === Complete Elicitation Notification === + +/** + * Notification sent by the agent when a URL-based elicitation is complete. + */ +@UnstableApi +@Serializable +public data class CompleteElicitationNotification( + val elicitationId: ElicitationId, + override val _meta: JsonElement? = null +) : AcpNotification + +// === Capabilities === + +/** + * Elicitation capabilities supported by the client. + */ +@UnstableApi +@Serializable +public data class ElicitationCapabilities( + val form: ElicitationFormCapabilities? = null, + val url: ElicitationUrlCapabilities? = null, + override val _meta: JsonElement? = null +) : AcpWithMeta { + /** + * Whether form-based elicitation is supported. + * + * Per the RFD, `"elicitation": {}` (both fields absent) is equivalent to form-only support. + * This property returns true when [form] is explicitly set OR when neither mode is declared + * (i.e., the capability object exists but is empty). + */ + val supportsForm: Boolean get() = form != null || (form == null && url == null) + + /** + * Whether URL-based elicitation is supported. + */ + val supportsUrl: Boolean get() = url != null +} + +/** + * Form-based elicitation capabilities. + */ +@UnstableApi +@Serializable +public data class ElicitationFormCapabilities( + override val _meta: JsonElement? = null +) : AcpWithMeta + +/** + * URL-based elicitation capabilities. + */ +@UnstableApi +@Serializable +public data class ElicitationUrlCapabilities( + override val _meta: JsonElement? = null +) : AcpWithMeta + +// === URL Elicitation Required Error Data === + +/** + * Data payload for the UrlElicitationRequired error. + */ +@UnstableApi +@Serializable +public data class UrlElicitationRequiredData( + val elicitations: List +) + +/** + * A single URL elicitation item within the UrlElicitationRequired error data. + */ +@UnstableApi +@Serializable +public data class UrlElicitationRequiredItem( + @EncodeDefault val mode: ElicitationUrlOnlyMode = ElicitationUrlOnlyMode.URL, + val elicitationId: ElicitationId, + val url: String, + val message: String +) diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt index dc62783..f43dc08 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt @@ -104,6 +104,12 @@ public open class AcpMethod(public val methodName: MethodName) { public object TerminalRelease : AcpSessionRequestResponseMethod("terminal/release", ReleaseTerminalRequest.serializer(), ReleaseTerminalResponse.serializer()) public object TerminalWaitForExit : AcpSessionRequestResponseMethod("terminal/wait_for_exit", WaitForTerminalExitRequest.serializer(), WaitForTerminalExitResponse.serializer()) public object TerminalKill : AcpSessionRequestResponseMethod("terminal/kill", KillTerminalCommandRequest.serializer(), KillTerminalCommandResponse.serializer()) + + // Elicitation methods + @UnstableApi + public object ElicitationCreate : AcpRequestResponseMethod("elicitation/create", CreateElicitationRequest.serializer(), CreateElicitationResponse.serializer()) + @UnstableApi + public object ElicitationComplete : AcpNotificationMethod("elicitation/complete", CompleteElicitationNotification.serializer()) } diff --git a/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/ElicitationSerializationTest.kt b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/ElicitationSerializationTest.kt new file mode 100644 index 0000000..698737c --- /dev/null +++ b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/ElicitationSerializationTest.kt @@ -0,0 +1,512 @@ +package com.agentclientprotocol.model + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.rpc.ACPJson +import com.agentclientprotocol.rpc.RequestId +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.jsonArray +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.assertFalse +import kotlin.test.assertIs +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import kotlin.test.assertTrue + +@OptIn(UnstableApi::class) +class ElicitationSerializationTest { + + // === CreateElicitationRequest Tests === + + @Test + fun `form mode request serialization - session scope`() { + val schema = ElicitationSchema( + properties = mapOf( + "name" to ElicitationPropertySchema.StringProperty() + ), + required = listOf("name") + ) + val req = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("sess_1")), + mode = ElicitationMode.Form(schema), + message = "Please enter your name" + ) + + val json = ACPJson.encodeToString(CreateElicitationRequest.serializer(), req) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("sess_1", jsonObj["sessionId"]?.jsonPrimitive?.content) + assertNull(jsonObj["toolCallId"]) + assertEquals("form", jsonObj["mode"]?.jsonPrimitive?.content) + assertEquals("Please enter your name", jsonObj["message"]?.jsonPrimitive?.content) + assertNotNull(jsonObj["requestedSchema"]) + assertEquals("object", jsonObj["requestedSchema"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + assertEquals("string", jsonObj["requestedSchema"]?.jsonObject?.get("properties")?.jsonObject?.get("name")?.jsonObject?.get("type")?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationRequest.serializer(), json) + assertIs(roundtripped.scope) + assertEquals(SessionId("sess_1"), (roundtripped.scope as ElicitationScope.Session).sessionId) + assertNull((roundtripped.scope as ElicitationScope.Session).toolCallId) + assertEquals("Please enter your name", roundtripped.message) + assertIs(roundtripped.mode) + } + + @Test + fun `url mode request serialization - session scope with toolCallId`() { + val req = CreateElicitationRequest( + scope = ElicitationScope.Session(SessionId("sess_2"), ToolCallId("tc_1")), + mode = ElicitationMode.Url(ElicitationId("elic_1"), "https://example.com/auth"), + message = "Please authenticate" + ) + + val json = ACPJson.encodeToString(CreateElicitationRequest.serializer(), req) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("sess_2", jsonObj["sessionId"]?.jsonPrimitive?.content) + assertEquals("tc_1", jsonObj["toolCallId"]?.jsonPrimitive?.content) + assertEquals("url", jsonObj["mode"]?.jsonPrimitive?.content) + assertEquals("elic_1", jsonObj["elicitationId"]?.jsonPrimitive?.content) + assertEquals("https://example.com/auth", jsonObj["url"]?.jsonPrimitive?.content) + assertEquals("Please authenticate", jsonObj["message"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationRequest.serializer(), json) + assertIs(roundtripped.scope) + assertEquals(SessionId("sess_2"), (roundtripped.scope as ElicitationScope.Session).sessionId) + assertEquals(ToolCallId("tc_1"), (roundtripped.scope as ElicitationScope.Session).toolCallId) + assertIs(roundtripped.mode) + } + + @Test + fun `request scope request serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "workspace" to ElicitationPropertySchema.StringProperty() + ), + required = listOf("workspace") + ) + val req = CreateElicitationRequest( + scope = ElicitationScope.Request(RequestId.create(99)), + mode = ElicitationMode.Form(schema), + message = "Enter workspace name" + ) + + val json = ACPJson.encodeToString(CreateElicitationRequest.serializer(), req) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals(99, jsonObj["requestId"]?.jsonPrimitive?.content?.toInt()) + assertNull(jsonObj["sessionId"]) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationRequest.serializer(), json) + assertIs(roundtripped.scope) + } + + // === CreateElicitationResponse Tests === + + @Test + fun `response accept serialization`() { + val resp = CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf("name" to ElicitationContentValue.StringValue("Alice")) + ) + ) + + val json = ACPJson.encodeToString(CreateElicitationResponse.serializer(), resp) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("accept", jsonObj["action"]?.jsonPrimitive?.content) + assertEquals("Alice", jsonObj["content"]?.jsonObject?.get("name")?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationResponse.serializer(), json) + assertIs(roundtripped.action) + assertNotNull((roundtripped.action as ElicitationAction.Accept).content) + } + + @Test + fun `response decline serialization`() { + val resp = CreateElicitationResponse(action = ElicitationAction.Decline) + + val json = ACPJson.encodeToString(CreateElicitationResponse.serializer(), resp) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("decline", jsonObj["action"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationResponse.serializer(), json) + assertIs(roundtripped.action) + } + + @Test + fun `response cancel serialization`() { + val resp = CreateElicitationResponse(action = ElicitationAction.Cancel) + + val json = ACPJson.encodeToString(CreateElicitationResponse.serializer(), resp) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("cancel", jsonObj["action"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationResponse.serializer(), json) + assertIs(roundtripped.action) + } + + @Test + fun `response accept with all content value types`() { + val resp = CreateElicitationResponse( + action = ElicitationAction.Accept( + content = mapOf( + "name" to ElicitationContentValue.StringValue("Alice"), + "age" to ElicitationContentValue.IntegerValue(30), + "score" to ElicitationContentValue.NumberValue(9.5), + "subscribed" to ElicitationContentValue.BooleanValue(true), + "tags" to ElicitationContentValue.StringArrayValue(listOf("rust", "acp")) + ) + ) + ) + + val json = ACPJson.encodeToString(CreateElicitationResponse.serializer(), resp) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("accept", jsonObj["action"]?.jsonPrimitive?.content) + val content = jsonObj["content"]!!.jsonObject + assertEquals("Alice", content["name"]?.jsonPrimitive?.content) + assertEquals("30", content["age"]?.jsonPrimitive?.content) + assertEquals("9.5", content["score"]?.jsonPrimitive?.content) + assertEquals("true", content["subscribed"]?.jsonPrimitive?.content) + assertEquals("rust", content["tags"]?.jsonArray?.get(0)?.jsonPrimitive?.content) + assertEquals("acp", content["tags"]?.jsonArray?.get(1)?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CreateElicitationResponse.serializer(), json) + val rtContent = (roundtripped.action as ElicitationAction.Accept).content!! + assertIs(rtContent["name"]) + assertIs(rtContent["age"]) + assertIs(rtContent["score"]) + assertIs(rtContent["subscribed"]) + assertIs(rtContent["tags"]) + } + + // === Complete Elicitation Notification === + + @Test + fun `completion notification serialization`() { + val notif = CompleteElicitationNotification(ElicitationId("elic_1")) + + val json = ACPJson.encodeToString(CompleteElicitationNotification.serializer(), notif) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("elic_1", jsonObj["elicitationId"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(CompleteElicitationNotification.serializer(), json) + assertEquals(ElicitationId("elic_1"), roundtripped.elicitationId) + } + + // === Capabilities Tests === + + @Test + fun `capabilities form only`() { + val caps = ElicitationCapabilities(form = ElicitationFormCapabilities()) + + val json = ACPJson.encodeToString(ElicitationCapabilities.serializer(), caps) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertTrue(jsonObj["form"] is JsonObject) + assertNull(jsonObj["url"]) + + val roundtripped = ACPJson.decodeFromString(ElicitationCapabilities.serializer(), json) + assertNotNull(roundtripped.form) + assertNull(roundtripped.url) + } + + @Test + fun `capabilities url only`() { + val caps = ElicitationCapabilities(url = ElicitationUrlCapabilities()) + + val json = ACPJson.encodeToString(ElicitationCapabilities.serializer(), caps) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertNull(jsonObj["form"]) + assertTrue(jsonObj["url"] is JsonObject) + + val roundtripped = ACPJson.decodeFromString(ElicitationCapabilities.serializer(), json) + assertNull(roundtripped.form) + assertNotNull(roundtripped.url) + } + + @Test + fun `capabilities both`() { + val caps = ElicitationCapabilities( + form = ElicitationFormCapabilities(), + url = ElicitationUrlCapabilities() + ) + + val json = ACPJson.encodeToString(ElicitationCapabilities.serializer(), caps) + val roundtripped = ACPJson.decodeFromString(ElicitationCapabilities.serializer(), json) + assertNotNull(roundtripped.form) + assertNotNull(roundtripped.url) + } + + // === Schema Tests === + + @Test + fun `schema builder serialization`() { + val schema = ElicitationSchema( + description = "User registration", + properties = mapOf( + "name" to ElicitationPropertySchema.StringProperty(), + "email" to ElicitationPropertySchema.StringProperty(format = StringFormat.EMAIL), + "age" to ElicitationPropertySchema.IntegerProperty(minimum = 0, maximum = 150), + "newsletter" to ElicitationPropertySchema.BooleanProperty() + ), + required = listOf("name", "email", "age") + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + assertEquals("object", jsonObj["type"]?.jsonPrimitive?.content) + assertEquals("User registration", jsonObj["description"]?.jsonPrimitive?.content) + val props = jsonObj["properties"]!!.jsonObject + assertEquals("string", props["name"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + assertEquals("string", props["email"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + assertEquals("email", props["email"]?.jsonObject?.get("format")?.jsonPrimitive?.content) + assertEquals("integer", props["age"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + assertEquals("0", props["age"]?.jsonObject?.get("minimum")?.jsonPrimitive?.content) + assertEquals("150", props["age"]?.jsonObject?.get("maximum")?.jsonPrimitive?.content) + assertEquals("boolean", props["newsletter"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + + val required = jsonObj["required"]!!.jsonArray.map { it.jsonPrimitive.content } + assertTrue("name" in required) + assertTrue("email" in required) + assertTrue("age" in required) + assertFalse("newsletter" in required) + + val roundtripped = ACPJson.decodeFromString(ElicitationSchema.serializer(), json) + assertEquals(4, roundtripped.properties.size) + assertTrue(roundtripped.required!!.contains("name")) + } + + @Test + fun `schema string enum serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "color" to ElicitationPropertySchema.StringProperty( + enumValues = listOf("red", "green", "blue") + ) + ), + required = listOf("color") + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val colorProp = jsonObj["properties"]!!.jsonObject["color"]!!.jsonObject + assertEquals("string", colorProp["type"]?.jsonPrimitive?.content) + assertEquals(3, colorProp["enum"]?.jsonArray?.size) + + val roundtripped = ACPJson.decodeFromString(ElicitationSchema.serializer(), json) + val stringProp = roundtripped.properties["color"] + assertIs(stringProp) + assertEquals(3, stringProp.enumValues!!.size) + } + + @Test + fun `schema titled enum serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "country" to ElicitationPropertySchema.StringProperty( + oneOf = listOf( + EnumOption("us", "United States"), + EnumOption("uk", "United Kingdom") + ) + ) + ), + required = listOf("country") + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val countryProp = jsonObj["properties"]!!.jsonObject["country"]!!.jsonObject + assertEquals("string", countryProp["type"]?.jsonPrimitive?.content) + val oneOf = countryProp["oneOf"]!!.jsonArray + assertEquals(2, oneOf.size) + assertEquals("us", oneOf[0].jsonObject["const"]?.jsonPrimitive?.content) + assertEquals("United States", oneOf[0].jsonObject["title"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(ElicitationSchema.serializer(), json) + val stringProp = roundtripped.properties["country"] + assertIs(stringProp) + assertEquals(2, stringProp.oneOf!!.size) + } + + @Test + fun `schema multi-select serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "colors" to ElicitationPropertySchema.ArrayProperty( + minItems = 1, + maxItems = 3, + items = MultiSelectItems.Untitled( + UntitledMultiSelectItems(values = listOf("red", "green", "blue")) + ) + ) + ) + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val colorsProp = jsonObj["properties"]!!.jsonObject["colors"]!!.jsonObject + assertEquals("array", colorsProp["type"]?.jsonPrimitive?.content) + assertEquals("string", colorsProp["items"]?.jsonObject?.get("type")?.jsonPrimitive?.content) + assertEquals("1", colorsProp["minItems"]?.jsonPrimitive?.content) + assertEquals("3", colorsProp["maxItems"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(ElicitationSchema.serializer(), json) + assertIs(roundtripped.properties["colors"]) + } + + @Test + fun `schema number property serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "rating" to ElicitationPropertySchema.NumberProperty(minimum = 0.0, maximum = 5.0) + ), + required = listOf("rating") + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val ratingProp = jsonObj["properties"]!!.jsonObject["rating"]!!.jsonObject + assertEquals("number", ratingProp["type"]?.jsonPrimitive?.content) + assertEquals(0.0, ratingProp["minimum"]?.jsonPrimitive?.content?.toDouble()) + assertEquals(5.0, ratingProp["maximum"]?.jsonPrimitive?.content?.toDouble()) + + val roundtripped = ACPJson.decodeFromString(ElicitationSchema.serializer(), json) + val numProp = roundtripped.properties["rating"] + assertIs(numProp) + assertEquals(0.0, numProp.minimum) + assertEquals(5.0, numProp.maximum) + } + + @Test + fun `schema string format serialization`() { + val schema = ElicitationSchema( + properties = mapOf( + "website" to ElicitationPropertySchema.StringProperty(format = StringFormat.URI), + "birthday" to ElicitationPropertySchema.StringProperty(format = StringFormat.DATE), + "updated_at" to ElicitationPropertySchema.StringProperty(format = StringFormat.DATE_TIME) + ), + required = listOf("website", "birthday") + ) + + val json = ACPJson.encodeToString(ElicitationSchema.serializer(), schema) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val props = jsonObj["properties"]!!.jsonObject + assertEquals("uri", props["website"]?.jsonObject?.get("format")?.jsonPrimitive?.content) + assertEquals("date", props["birthday"]?.jsonObject?.get("format")?.jsonPrimitive?.content) + assertEquals("date-time", props["updated_at"]?.jsonObject?.get("format")?.jsonPrimitive?.content) + + val required = jsonObj["required"]!!.jsonArray.map { it.jsonPrimitive.content } + assertTrue("website" in required) + assertTrue("birthday" in required) + assertFalse("updated_at" in required) + } + + // === URL Elicitation Required Error Data === + + @Test + fun `url elicitation required data serialization`() { + val data = UrlElicitationRequiredData( + elicitations = listOf( + UrlElicitationRequiredItem( + elicitationId = ElicitationId("elic_1"), + url = "https://example.com/auth", + message = "Please authenticate" + ) + ) + ) + + val json = ACPJson.encodeToString(UrlElicitationRequiredData.serializer(), data) + val jsonObj = ACPJson.decodeFromString(JsonObject.serializer(), json) + + val items = jsonObj["elicitations"]!!.jsonArray + assertEquals(1, items.size) + assertEquals("url", items[0].jsonObject["mode"]?.jsonPrimitive?.content) + assertEquals("elic_1", items[0].jsonObject["elicitationId"]?.jsonPrimitive?.content) + assertEquals("https://example.com/auth", items[0].jsonObject["url"]?.jsonPrimitive?.content) + + val roundtripped = ACPJson.decodeFromString(UrlElicitationRequiredData.serializer(), json) + assertEquals(1, roundtripped.elicitations.size) + assertEquals(ElicitationUrlOnlyMode.URL, roundtripped.elicitations[0].mode) + } + + // === Request tolerates extra fields === + + @Test + fun `request tolerates extra fields`() { + val jsonStr = """ + { + "sessionId": "sess_1", + "mode": "form", + "message": "Enter your name", + "requestedSchema": { + "type": "object", + "properties": { + "name": { "type": "string", "title": "Name" } + }, + "required": ["name"] + }, + "unknownStringField": "hello", + "unknownNumberField": 42 + } + """.trimIndent() + + val req = ACPJson.decodeFromString(CreateElicitationRequest.serializer(), jsonStr) + assertIs(req.scope) + assertEquals(SessionId("sess_1"), (req.scope as ElicitationScope.Session).sessionId) + assertNull((req.scope as ElicitationScope.Session).toolCallId) + assertEquals("Enter your name", req.message) + assertIs(req.mode) + } + + // === Content value strict array validation === + + @Test + fun `content value rejects non-string items in array`() { + // An array with a boolean should fail - RFD only allows string arrays + val jsonStr = """{"action":"accept","content":{"tags":[1, true]}}""" + assertFailsWith { + ACPJson.decodeFromString(CreateElicitationResponse.serializer(), jsonStr) + } + } + + @Test + fun `content value rejects nested object in array`() { + val jsonStr = """{"action":"accept","content":{"tags":[{"key":"val"}]}}""" + assertFailsWith { + ACPJson.decodeFromString(CreateElicitationResponse.serializer(), jsonStr) + } + } + + // === ClientCapabilities with elicitation === + + @Test + fun `client capabilities with elicitation round-trip`() { + val caps = ClientCapabilities( + elicitation = ElicitationCapabilities( + form = ElicitationFormCapabilities(), + url = ElicitationUrlCapabilities() + ) + ) + + val json = ACPJson.encodeToString(ClientCapabilities.serializer(), caps) + val roundtripped = ACPJson.decodeFromString(ClientCapabilities.serializer(), json) + assertNotNull(roundtripped.elicitation) + assertNotNull(roundtripped.elicitation!!.form) + assertNotNull(roundtripped.elicitation!!.url) + } +} diff --git a/acp/api/acp.api b/acp/api/acp.api index e70433e..82cd98e 100644 --- a/acp/api/acp.api +++ b/acp/api/acp.api @@ -151,12 +151,14 @@ public final class com/agentclientprotocol/agent/NesAgentSession$DefaultImpls { } public final class com/agentclientprotocol/client/Client { - public fun (Lcom/agentclientprotocol/protocol/Protocol;)V + public fun (Lcom/agentclientprotocol/protocol/Protocol;Lcom/agentclientprotocol/client/GlobalElicitationHandler;)V + public synthetic fun (Lcom/agentclientprotocol/protocol/Protocol;Lcom/agentclientprotocol/client/GlobalElicitationHandler;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun authenticate-fMnwWJU (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun authenticate-fMnwWJU$default (Lcom/agentclientprotocol/client/Client;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun forkSession-wPMwmcM (Ljava/lang/String;Lcom/agentclientprotocol/common/SessionCreationParameters;Lcom/agentclientprotocol/client/ClientOperationsFactory;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public final fun getAgentInfo ()Lcom/agentclientprotocol/agent/AgentInfo; public final fun getClientInfo ()Lcom/agentclientprotocol/client/ClientInfo; + public final fun getGlobalElicitationHandler ()Lcom/agentclientprotocol/client/GlobalElicitationHandler; public final fun getNesSession-0izbxq0 (Ljava/lang/String;)Lcom/agentclientprotocol/client/ClientNesSession; public final fun getProtocol ()Lcom/agentclientprotocol/protocol/Protocol; public final fun getSession-0izbxq0 (Ljava/lang/String;)Lcom/agentclientprotocol/client/ClientSession; @@ -280,7 +282,11 @@ public final class com/agentclientprotocol/client/ClientSessionKt { public static synthetic fun setConfigOption-lh9iGNw$default (Lcom/agentclientprotocol/client/ClientSession;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; } -public abstract interface class com/agentclientprotocol/common/ClientSessionOperations : com/agentclientprotocol/common/FileSystemOperations, com/agentclientprotocol/common/TerminalOperations { +public abstract interface class com/agentclientprotocol/client/GlobalElicitationHandler { + public abstract fun createElicitation (Lcom/agentclientprotocol/model/CreateElicitationRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public abstract interface class com/agentclientprotocol/common/ClientSessionOperations : com/agentclientprotocol/common/ElicitationOperations, com/agentclientprotocol/common/FileSystemOperations, com/agentclientprotocol/common/TerminalOperations { public abstract fun notify (Lcom/agentclientprotocol/model/SessionUpdate;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun notify$default (Lcom/agentclientprotocol/common/ClientSessionOperations;Lcom/agentclientprotocol/model/SessionUpdate;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public abstract fun requestPermissions (Lcom/agentclientprotocol/model/SessionUpdate$ToolCallUpdate;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; @@ -288,6 +294,8 @@ public abstract interface class com/agentclientprotocol/common/ClientSessionOper } public final class com/agentclientprotocol/common/ClientSessionOperations$DefaultImpls { + public static fun completeElicitation (Lcom/agentclientprotocol/common/ClientSessionOperations;Lcom/agentclientprotocol/model/CompleteElicitationNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static fun createElicitation (Lcom/agentclientprotocol/common/ClientSessionOperations;Lcom/agentclientprotocol/model/CreateElicitationRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static fun fsReadTextFile-i6TIkSo (Lcom/agentclientprotocol/common/ClientSessionOperations;Ljava/lang/String;Lkotlin/UInt;Lkotlin/UInt;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static fun fsWriteTextFile (Lcom/agentclientprotocol/common/ClientSessionOperations;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public static synthetic fun notify$default (Lcom/agentclientprotocol/common/ClientSessionOperations;Lcom/agentclientprotocol/model/SessionUpdate;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; @@ -299,6 +307,18 @@ public final class com/agentclientprotocol/common/ClientSessionOperations$Defaul public static fun terminalWaitForExit (Lcom/agentclientprotocol/common/ClientSessionOperations;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; } +public abstract interface class com/agentclientprotocol/common/ElicitationOperations { + public fun completeElicitation (Lcom/agentclientprotocol/model/CompleteElicitationNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun completeElicitation$suspendImpl (Lcom/agentclientprotocol/common/ElicitationOperations;Lcom/agentclientprotocol/model/CompleteElicitationNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun createElicitation (Lcom/agentclientprotocol/model/CreateElicitationRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun createElicitation$suspendImpl (Lcom/agentclientprotocol/common/ElicitationOperations;Lcom/agentclientprotocol/model/CreateElicitationRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class com/agentclientprotocol/common/ElicitationOperations$DefaultImpls { + public static fun completeElicitation (Lcom/agentclientprotocol/common/ElicitationOperations;Lcom/agentclientprotocol/model/CompleteElicitationNotification;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static fun createElicitation (Lcom/agentclientprotocol/common/ElicitationOperations;Lcom/agentclientprotocol/model/CreateElicitationRequest;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + public abstract class com/agentclientprotocol/common/Event { } @@ -396,8 +416,9 @@ public final class com/agentclientprotocol/protocol/Protocol : com/agentclientpr public static synthetic fun cancelPendingOutgoingRequests$default (Lcom/agentclientprotocol/protocol/Protocol;Ljava/util/concurrent/CancellationException;ILjava/lang/Object;)V public final fun close ()V public final fun getOptions ()Lcom/agentclientprotocol/protocol/ProtocolOptions; + public final fun getOutgoingRequestSessionId-uYPZQ4A (Lcom/agentclientprotocol/rpc/RequestId;)Ljava/lang/String; public fun sendNotificationRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlinx/serialization/json/JsonElement;)V - public fun sendRequestRaw-TF-lsE4 (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public fun sendRequestRaw-LE58_i8 (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun setNotificationHandlerRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V public fun setRequestHandlerRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpRequestResponseMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V public final fun start ()V @@ -437,8 +458,8 @@ public final class com/agentclientprotocol/protocol/Protocol_extensionsKt { public abstract interface class com/agentclientprotocol/protocol/RpcMethodsOperations { public abstract fun sendNotificationRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlinx/serialization/json/JsonElement;)V public static synthetic fun sendNotificationRaw$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)V - public abstract fun sendRequestRaw-TF-lsE4 (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun sendRequestRaw-TF-lsE4$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public abstract fun sendRequestRaw-LE58_i8 (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun sendRequestRaw-LE58_i8$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public abstract fun setNotificationHandlerRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V public static synthetic fun setNotificationHandlerRaw$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V public abstract fun setRequestHandlerRaw (Lcom/agentclientprotocol/model/AcpMethod$AcpRequestResponseMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;)V @@ -447,7 +468,7 @@ public abstract interface class com/agentclientprotocol/protocol/RpcMethodsOpera public final class com/agentclientprotocol/protocol/RpcMethodsOperations$DefaultImpls { public static synthetic fun sendNotificationRaw$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)V - public static synthetic fun sendRequestRaw-TF-lsE4$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static synthetic fun sendRequestRaw-LE58_i8$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public static synthetic fun setNotificationHandlerRaw$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Lcom/agentclientprotocol/model/AcpMethod$AcpNotificationMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V public static synthetic fun setRequestHandlerRaw$default (Lcom/agentclientprotocol/protocol/RpcMethodsOperations;Lcom/agentclientprotocol/model/AcpMethod$AcpRequestResponseMethod;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V } diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/RemoteClientSessionOperations.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/RemoteClientSessionOperations.kt index 947fb66..b887b4b 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/RemoteClientSessionOperations.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/RemoteClientSessionOperations.kt @@ -1,5 +1,6 @@ package com.agentclientprotocol.agent +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.common.ClientSessionOperations import com.agentclientprotocol.model.* import com.agentclientprotocol.protocol.RpcMethodsOperations @@ -84,4 +85,57 @@ internal class RemoteClientSessionOperations(private val rpc: RpcMethodsOperatio if (!clientCapabilities.terminal) error("Client does not support terminal capability") return AcpMethod.ClientMethods.TerminalKill(rpc, KillTerminalCommandRequest(sessionId, terminalId, _meta)) } + + @OptIn(UnstableApi::class) + override suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + val elicitation = clientCapabilities.elicitation + ?: error("Client does not support elicitation capability") + when (request.mode) { + is ElicitationMode.Form -> { + if (!elicitation.supportsForm) error("Client does not support form-based elicitation") + } + is ElicitationMode.Url -> { + if (!elicitation.supportsUrl) error("Client does not support URL-based elicitation") + } + } + return AcpMethod.ClientMethods.ElicitationCreate(rpc, request) + } + + /** + * Convenience method that creates an elicitation request with session scope auto-filled. + */ + @OptIn(UnstableApi::class) + public suspend fun createSessionElicitation( + mode: ElicitationMode, + message: String, + toolCallId: ToolCallId? = null, + _meta: JsonElement? = null + ): CreateElicitationResponse { + return createElicitation(CreateElicitationRequest( + scope = ElicitationScope.Session(sessionId, toolCallId), + mode = mode, + message = message, + _meta = _meta + )) + } + + @OptIn(UnstableApi::class) + override suspend fun completeElicitation( + notification: CompleteElicitationNotification + ) { + AcpMethod.ClientMethods.ElicitationComplete(rpc, notification) + } + + /** + * Convenience method to complete a URL-mode elicitation. + */ + @OptIn(UnstableApi::class) + public suspend fun completeElicitation( + elicitationId: ElicitationId, + _meta: JsonElement? = null + ) { + completeElicitation(CompleteElicitationNotification(elicitationId, _meta)) + } } \ No newline at end of file diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt index ecab3d6..321557a 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt @@ -4,6 +4,7 @@ package com.agentclientprotocol.client import com.agentclientprotocol.agent.AgentInfo import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.common.ElicitationOperations import com.agentclientprotocol.common.FileSystemOperations import com.agentclientprotocol.common.SessionCreationParameters import com.agentclientprotocol.common.TerminalOperations @@ -37,8 +38,11 @@ public typealias ClientInstance = Client * * See protocol docs: [Client](https://agentclientprotocol.com/protocol/overview#client) */ +@OptIn(UnstableApi::class) public class Client( - public val protocol: Protocol + public val protocol: Protocol, + @property:UnstableApi + public val globalElicitationHandler: GlobalElicitationHandler? = null ) { private class ClientSessionHolder { private val sessionDeferred: CompletableDeferred = CompletableDeferred() @@ -85,6 +89,8 @@ public class Client( private val _sessions = atomic(SessionsStorage()) private val _nesSessions = atomic(persistentMapOf()) + @OptIn(UnstableApi::class) + private val _elicitationToSession = ElicitationSessionStore() /** * Creates a new entry only if there are some currently initializing sessions. Otherwise, throws in the case of missing session. @@ -117,6 +123,8 @@ public class Client( _sessions.update { currentMap -> currentMap.copy(sessions = currentMap.sessions.remove(sessionId)) } + @OptIn(UnstableApi::class) + _elicitationToSession.removeBySession(sessionId) } @OptIn(UnstableApi::class) @@ -203,6 +211,61 @@ public class Client( val sessionHolder = getOrCreateSessionHolder(params.sessionId) sessionHolder.handleOrQueue(params.update, params._meta) } + + @OptIn(UnstableApi::class) + protocol.setRequestHandler(AcpMethod.ClientMethods.ElicitationCreate) { params: CreateElicitationRequest -> + when (val scope = params.scope) { + is ElicitationScope.Session -> { + val session = getSessionOrThrow(scope.sessionId) + val ops = session.operations as? ElicitationOperations + ?: sessionMethodNotFound(AcpMethod.ClientMethods.ElicitationCreate) + val response = session.executeWithSession { ops.createElicitation(params) } + // Only track URL-mode elicitation → session after a successful Accept response, + // since elicitation/complete only follows an accepted URL elicitation + trackUrlElicitationIfAccepted(params.mode, response, scope.sessionId) + response + } + is ElicitationScope.Request -> { + val sessionId = protocol.getOutgoingRequestSessionId(scope.requestId) + if (sessionId != null) { + val session = getSessionOrThrow(sessionId) + val ops = session.operations as? ElicitationOperations + ?: sessionMethodNotFound(AcpMethod.ClientMethods.ElicitationCreate) + val response = session.executeWithSession { ops.createElicitation(params) } + trackUrlElicitationIfAccepted(params.mode, response, sessionId) + response + } else { + @OptIn(UnstableApi::class) + val handler = globalElicitationHandler + ?: acpFail("No handler for non-session elicitation") + handler.createElicitation(params) + } + } + } + } + + @OptIn(UnstableApi::class) + protocol.setNotificationHandler(AcpMethod.ClientMethods.ElicitationComplete) { params: CompleteElicitationNotification -> + var sessionId: SessionId? = _elicitationToSession.remove(params.elicitationId) + + if (sessionId != null) { + // Session may have been closed between the elicitation and the completion; + // per the RFD, ignore unknown/already-completed IDs gracefully + + + val holder = _sessions.value.sessions[sessionId] + if (holder != null && holder.session.isCompleted) { + val session = runCatching { getSessionOrThrow(sessionId) }.getOrNull() + if (session != null) { + val ops = session.operations as? ElicitationOperations + if (ops != null) { + session.executeWithSession { ops.completeElicitation(params) } + } + } + } + } + // else: unknown or already-completed elicitation ID — silently ignore per RFD + } } public val clientInfo: ClientInfo @@ -468,6 +531,13 @@ public class Client( return getOrCreateSessionHolder(sessionId).session.await() } + @OptIn(UnstableApi::class) + private fun trackUrlElicitationIfAccepted(mode: ElicitationMode, response: CreateElicitationResponse, sessionId: SessionId) { + if (mode is ElicitationMode.Url && response.action is ElicitationAction.Accept) { + _elicitationToSession.put(mode.elicitationId, sessionId) + } + } + private suspend fun withInitializingSession(block: suspend () -> T): T { _sessions.update { it.copy(initializingSessionsCount = it.initializingSessionsCount + 1) } try { diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ElicitationSessionStore.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ElicitationSessionStore.kt new file mode 100644 index 0000000..548544b --- /dev/null +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ElicitationSessionStore.kt @@ -0,0 +1,67 @@ +package com.agentclientprotocol.client + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.model.ElicitationId +import com.agentclientprotocol.model.SessionId +import kotlinx.atomicfu.atomic +import kotlinx.atomicfu.update +import kotlinx.collections.immutable.persistentMapOf + +/** + * A mutable, bounded map from [ElicitationId] to [SessionId] with bulk eviction. + * + * When [maxCapacity] is reached, the oldest half of entries is evicted. + * Entries can also be removed individually or bulk-removed by session + * when a session is torn down. + */ +@UnstableApi +internal class ElicitationSessionStore( + private val maxCapacity: Int = MAX_ELICITATION_ENTRIES, +) { + private data class Entry(val sessionId: SessionId, val ordinal: Long) + + private val counter = atomic(0L) + private val entries = atomic(persistentMapOf()) + + operator fun get(elicitationId: ElicitationId): SessionId? = entries.value[elicitationId]?.sessionId + + fun put(elicitationId: ElicitationId, sessionId: SessionId) { + entries.update { it.put(elicitationId, Entry(sessionId, counter.getAndIncrement())) } + if (entries.value.size > maxCapacity) { + evictOldestHalf() + } + } + + fun remove(elicitationId: ElicitationId): SessionId? { + val sessionId = entries.value[elicitationId]?.sessionId + entries.update { it.remove(elicitationId) } + return sessionId + } + + fun removeBySession(sessionId: SessionId) { + val toRemove = entries.value.filter { it.value.sessionId == sessionId }.map { it.key } + entries.update { + toRemove.fold(it) { acc, elicitationId -> acc.remove(elicitationId) } + } + } + + private fun evictOldestHalf() { + val value = entries.value + val toRemove = value.entries + .sortedBy { it.value.ordinal } + .take(value.size / 2) + .map { it.key } + entries.update { + toRemove.fold(it) { acc, elicitationId -> acc.remove(elicitationId) } + } + } + + companion object { + /** + * Maximum number of tracked URL-mode elicitation→session mappings. + * Entries are removed on elicitation/complete and on session teardown; + * this cap is a safety net for cases where completions never arrive. + */ + const val MAX_ELICITATION_ENTRIES = 10_000 + } +} diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/GlobalElicitationHandler.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/GlobalElicitationHandler.kt new file mode 100644 index 0000000..cab5a53 --- /dev/null +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/GlobalElicitationHandler.kt @@ -0,0 +1,16 @@ +package com.agentclientprotocol.client + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.model.CreateElicitationRequest +import com.agentclientprotocol.model.CreateElicitationResponse + +/** + * Handler for elicitation requests that are not associated with any session. + * + * This is used when an elicitation arrives with [com.agentclientprotocol.model.ElicitationScope.Request] + * scope and the referenced request does not belong to any session. + */ +@UnstableApi +public fun interface GlobalElicitationHandler { + public suspend fun createElicitation(request: CreateElicitationRequest): CreateElicitationResponse +} diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ClientSessionOperations.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ClientSessionOperations.kt index 1c99b78..a2412ce 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ClientSessionOperations.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ClientSessionOperations.kt @@ -1,5 +1,6 @@ package com.agentclientprotocol.common +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.model.PermissionOption import com.agentclientprotocol.model.RequestPermissionResponse import com.agentclientprotocol.model.SessionUpdate @@ -11,8 +12,10 @@ import kotlinx.serialization.json.JsonElement * * @see FileSystemOperations * @see TerminalOperations + * @see ElicitationOperations */ -public interface ClientSessionOperations : FileSystemOperations, TerminalOperations { +@OptIn(UnstableApi::class) +public interface ClientSessionOperations : FileSystemOperations, TerminalOperations, ElicitationOperations { /** * Requests permissions */ diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ElicitationOperations.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ElicitationOperations.kt new file mode 100644 index 0000000..05e6584 --- /dev/null +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/common/ElicitationOperations.kt @@ -0,0 +1,21 @@ +package com.agentclientprotocol.common + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.model.CompleteElicitationNotification +import com.agentclientprotocol.model.CreateElicitationRequest +import com.agentclientprotocol.model.CreateElicitationResponse + +@UnstableApi +public interface ElicitationOperations { + public suspend fun createElicitation( + request: CreateElicitationRequest + ): CreateElicitationResponse { + throw NotImplementedError("Must be implemented by client when advertising elicitation capability") + } + + public suspend fun completeElicitation( + notification: CompleteElicitationNotification + ) { + throw NotImplementedError("Must be implemented by client when advertising elicitation capability") + } +} diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.extensions.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.extensions.kt index fd45243..59e4daa 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.extensions.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.extensions.kt @@ -7,6 +7,7 @@ import com.agentclientprotocol.model.AcpPaginatedRequest import com.agentclientprotocol.model.AcpPaginatedResponse import com.agentclientprotocol.model.AcpRequest import com.agentclientprotocol.model.AcpResponse +import com.agentclientprotocol.model.AcpWithSessionId import com.agentclientprotocol.rpc.ACPJson import com.agentclientprotocol.rpc.JsonRpcRequest import com.agentclientprotocol.util.PaginatedResponseToFlowAdapter @@ -27,8 +28,9 @@ public suspend fun RpcMethodsOp request: TRequest? ): TResponse { val params = request?.let { ACPJson.encodeToJsonElement(method.requestSerializer, request) } + val sessionId = (request as? AcpWithSessionId)?.sessionId // if we've got null, we can interpret it as {} - val responseJson = this.sendRequestRaw(method.methodName, params).takeIf { it != JsonNull } ?: buildJsonObject { } + val responseJson = this.sendRequestRaw(method.methodName, params, sessionId).takeIf { it != JsonNull } ?: buildJsonObject { } return ACPJson.decodeFromJsonElement(method.responseSerializer, responseJson) } diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.kt index 5293c15..9f45cd0 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/protocol/Protocol.kt @@ -4,6 +4,7 @@ package com.agentclientprotocol.protocol import com.agentclientprotocol.model.AcpMethod import com.agentclientprotocol.model.CancelRequestNotification +import com.agentclientprotocol.model.SessionId import com.agentclientprotocol.rpc.* import com.agentclientprotocol.transport.Transport import com.agentclientprotocol.transport.asMessageChannel @@ -30,6 +31,11 @@ internal value class IncomingRequestId(val id: RequestId) @JvmInline internal value class OutgoingRequestId(val id: RequestId) +internal data class OutgoingRequest( + val deferred: CompletableDeferred, + val sessionId: SessionId? = null +) + /** * An exception that gracefully handled and passed to the counterpart. */ @@ -103,7 +109,8 @@ public interface RpcMethodsOperations { */ public suspend fun sendRequestRaw( method: MethodName, - params: JsonElement? = null + params: JsonElement? = null, + sessionId: SessionId? = null ): JsonElement /** @@ -130,7 +137,7 @@ public class Protocol( + Dispatchers.Default.limitedParallelism(parallelism = 1) + CoroutineName(options.protocolDebugName)) // now the incoming and outgoing requests can clash by ids, but it should not be a problem private val requestIdCounter: AtomicInt = atomic(0) - private val pendingOutgoingRequests: AtomicRef>> = + private val pendingOutgoingRequests: AtomicRef> = atomic(persistentMapOf()) private val pendingIncomingRequests: AtomicRef> = atomic(persistentMapOf()) @@ -185,12 +192,14 @@ public class Protocol( */ public override suspend fun sendRequestRaw( method: MethodName, - params: JsonElement? + params: JsonElement?, + sessionId: SessionId? ): JsonElement { val requestId = OutgoingRequestId(RequestId.create(requestIdCounter.incrementAndGet())) val deferred = CompletableDeferred() + val outgoingRequest = OutgoingRequest(deferred, sessionId) - pendingOutgoingRequests.update { it.put(requestId, deferred) } + pendingOutgoingRequests.update { it.put(requestId, outgoingRequest) } try { val request = JsonRpcRequest( @@ -296,6 +305,15 @@ public class Protocol( } } + /** + * Looks up the session ID associated with an outgoing request that is currently in-flight. + * + * Returns null if the request is not found or was not associated with a session. + */ + public fun getOutgoingRequestSessionId(requestId: RequestId): SessionId? { + return pendingOutgoingRequests.value[OutgoingRequestId(requestId)]?.sessionId + } + /** * Close the protocol and cleanup resources. */ @@ -340,9 +358,9 @@ public class Protocol( */ public fun cancelPendingOutgoingRequests(ce: CancellationException? = null) { val requests = pendingOutgoingRequests.getAndUpdate { it.clear() } - for (deferred in requests.values) { - logger.trace { "Canceling pending outgoing request: ${deferred.key}" } - deferred.cancel(ce) + for ((requestId, outgoing) in requests) { + logger.trace { "Canceling pending outgoing request: $requestId" } + outgoing.deferred.cancel(ce) } } @@ -453,11 +471,12 @@ public class Protocol( private fun handleResponse(response: JsonRpcResponse) { val outgoingRequestId = OutgoingRequestId(response.id) - var deferred: CompletableDeferred? = null + var outgoing: OutgoingRequest? = null pendingOutgoingRequests.update { currentRequests -> - deferred = currentRequests[outgoingRequestId] + outgoing = currentRequests[outgoingRequestId] currentRequests.remove(outgoingRequestId) } + val deferred = outgoing?.deferred if (deferred != null) { val responseError = response.error if (responseError != null) { diff --git a/acp/src/jvmTest/kotlin/com/agentclientprotocol/client/ElicitationSessionMapTest.kt b/acp/src/jvmTest/kotlin/com/agentclientprotocol/client/ElicitationSessionMapTest.kt new file mode 100644 index 0000000..5e4a283 --- /dev/null +++ b/acp/src/jvmTest/kotlin/com/agentclientprotocol/client/ElicitationSessionMapTest.kt @@ -0,0 +1,199 @@ +package com.agentclientprotocol.client + +import com.agentclientprotocol.annotations.UnstableApi +import com.agentclientprotocol.model.ElicitationId +import com.agentclientprotocol.model.SessionId +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertNull + +@OptIn(UnstableApi::class) +class ElicitationSessionMapTest { + + private val session1 = SessionId("session-1") + private val session2 = SessionId("session-2") + private val elicitation1 = ElicitationId("elicit-1") + private val elicitation2 = ElicitationId("elicit-2") + private val elicitation3 = ElicitationId("elicit-3") + + private fun createMap(maxCapacity: Int = 10_000) = + ElicitationSessionStore(maxCapacity = maxCapacity) + + @Test + fun `get returns null for unknown elicitation`() { + val map = createMap() + assertNull(map[elicitation1]) + } + + @Test + fun `put and get a single entry`() { + val map = createMap() + map.put(elicitation1, session1) + assertEquals(session1, map[elicitation1]) + } + + @Test + fun `put multiple entries and retrieve each`() { + val map = createMap() + map.put(elicitation1, session1) + map.put(elicitation2, session2) + map.put(elicitation3, session1) + + assertEquals(session1, map[elicitation1]) + assertEquals(session2, map[elicitation2]) + assertEquals(session1, map[elicitation3]) + } + + @Test + fun `put overwrites value for existing key`() { + val map = createMap() + map.put(elicitation1, session1) + map.put(elicitation2, session1) + map.put(elicitation1, session2) + + assertEquals(session2, map[elicitation1]) + assertEquals(session1, map[elicitation2]) + } + + @Test + fun `remove deletes the entry`() { + val map = createMap() + map.put(elicitation1, session1) + map.put(elicitation2, session2) + map.remove(elicitation1) + + assertNull(map[elicitation1]) + assertEquals(session2, map[elicitation2]) + } + + @Test + fun `removeBySession removes all entries for that session`() { + val map = createMap() + map.put(elicitation1, session1) + map.put(elicitation2, session1) + map.put(elicitation3, session2) + map.removeBySession(session1) + + assertNull(map[elicitation1]) + assertNull(map[elicitation2]) + assertEquals(session2, map[elicitation3]) + } + + @Test + fun `evicts oldest half when capacity is exceeded`() { + val map = createMap(maxCapacity = 4) + val ids = (1..5).map { ElicitationId("e-$it") } + + // Fill to capacity + for (id in ids.take(4)) map.put(id, session1) + + // 5th insert exceeds capacity → evicts oldest half (2 entries) + map.put(ids[4], session1) + + // e-1 and e-2 (oldest) should be evicted + assertNull(map[ids[0]]) + assertNull(map[ids[1]]) + // e-3, e-4, e-5 should remain + assertEquals(session1, map[ids[2]]) + assertEquals(session1, map[ids[3]]) + assertEquals(session1, map[ids[4]]) + } + + @Test + fun `evicts oldest half with odd count`() { + val map = createMap(maxCapacity = 3) + val ids = (1..4).map { ElicitationId("e-$it") } + + for (id in ids.take(3)) map.put(id, session1) + + // 4th insert exceeds capacity → 4 entries, evicts 4/2=2 + map.put(ids[3], session1) + + assertNull(map[ids[0]]) + assertNull(map[ids[1]]) + assertEquals(session1, map[ids[2]]) + assertEquals(session1, map[ids[3]]) + } + + @Test + fun `overwriting existing key does not trigger eviction`() { + val map = createMap(maxCapacity = 2) + map.put(elicitation1, session1) + map.put(elicitation2, session1) + // Overwrite — still 2 entries, no eviction + map.put(elicitation1, session2) + + assertEquals(session2, map[elicitation1]) + assertEquals(session1, map[elicitation2]) + } + + @Test + fun `remove frees capacity for new entries`() { + val map = createMap(maxCapacity = 2) + map.put(elicitation1, session1) + map.put(elicitation2, session1) + map.remove(elicitation1) + map.put(elicitation3, session2) + + assertNull(map[elicitation1]) + assertEquals(session1, map[elicitation2]) + assertEquals(session2, map[elicitation3]) + } + + @Test + fun `eviction order is based on insertion timestamp`() { + val map = createMap(maxCapacity = 4) + + map.put(elicitation1, session1) // timestamp 0 + map.put(elicitation2, session1) // timestamp 1 + map.put(elicitation3, session1) // timestamp 2 + + // Overwrite elicitation1 — gets new timestamp (3) + map.put(elicitation1, session2) + + // Fill past capacity + val e4 = ElicitationId("e-4") + val e5 = ElicitationId("e-5") + map.put(e4, session1) // timestamp 4 → size=4, at capacity + map.put(e5, session1) // timestamp 5 → size=5, evict oldest 2 + + // elicitation2 (ts=1) and elicitation3 (ts=2) should be evicted + assertNull(map[elicitation2]) + assertNull(map[elicitation3]) + // elicitation1 (ts=3), e4 (ts=4), e5 (ts=5) remain + assertEquals(session2, map[elicitation1]) + assertEquals(session1, map[e4]) + assertEquals(session1, map[e5]) + } + + @Test + fun `multiple eviction cycles work correctly`() { + val map = createMap(maxCapacity = 2) + val ids = (1..6).map { ElicitationId("e-$it") } + + map.put(ids[0], session1) // ts=0 + map.put(ids[1], session1) // ts=1 + // 3rd insert → 3 entries, evict 1 (3/2=1) + map.put(ids[2], session1) // ts=2 + + // After eviction: ids[1] (ts=1) and ids[2] (ts=2) remain + assertNull(map[ids[0]]) + assertEquals(session1, map[ids[1]]) + assertEquals(session1, map[ids[2]]) + + map.put(ids[3], session1) // ts=3 → 3 entries, evict 1 + assertNull(map[ids[1]]) + assertEquals(session1, map[ids[2]]) + assertEquals(session1, map[ids[3]]) + } + + @Test + fun `capacity of 1 evicts the only entry on overflow`() { + val map = createMap(maxCapacity = 1) + map.put(elicitation1, session1) // ts=0 + map.put(elicitation2, session2) // ts=1 → 2 entries, evict 2/2=1 + + assertNull(map[elicitation1]) + assertEquals(session2, map[elicitation2]) + } +} diff --git a/build.gradle.kts b/build.gradle.kts index ca8a50d..8bc029c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,7 +7,7 @@ plugins { private val buildNumber: String? = System.getenv("GITHUB_RUN_NUMBER") private val isReleasePublication = System.getenv("RELEASE_PUBLICATION")?.toBoolean() ?: false -private val baseVersion = "0.18.1" +private val baseVersion = "0.19.0" allprojects { group = "com.agentclientprotocol"