diff --git a/acp-model/api/acp-model.api b/acp-model/api/acp-model.api index eefd011..3dd270d 100644 --- a/acp-model/api/acp-model.api +++ b/acp-model/api/acp-model.api @@ -1660,6 +1660,36 @@ public final class com/agentclientprotocol/model/McpServer$Stdio$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/MessageId { + public static final field Companion Lcom/agentclientprotocol/model/MessageId$Companion; + public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/agentclientprotocol/model/MessageId; + 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/MessageId$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/MessageId$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-D4v84t0 (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-XmIeEkI (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/String;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/MessageId$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/ModelId { public static final field Companion Lcom/agentclientprotocol/model/ModelId$Companion; public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/agentclientprotocol/model/ModelId; @@ -2000,14 +2030,16 @@ public final class com/agentclientprotocol/model/PromptCapabilities$Companion { public final class com/agentclientprotocol/model/PromptRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId { public static final field Companion Lcom/agentclientprotocol/model/PromptRequest$Companion; - public synthetic fun (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;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/util/List; - public final fun component3 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy-nk3TnMc (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PromptRequest; - public static synthetic fun copy-nk3TnMc$default (Lcom/agentclientprotocol/model/PromptRequest;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PromptRequest; + public final fun component3-f2XpNSU ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy-q1vIVlU (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PromptRequest; + public static synthetic fun copy-q1vIVlU$default (Lcom/agentclientprotocol/model/PromptRequest;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PromptRequest; public fun equals (Ljava/lang/Object;)Z + public final fun getMessageId-f2XpNSU ()Ljava/lang/String; public final fun getPrompt ()Ljava/util/List; public fun getSessionId-7EW-EgU ()Ljava/lang/String; public fun get_meta ()Lkotlinx/serialization/json/JsonElement; @@ -2032,14 +2064,16 @@ public final class com/agentclientprotocol/model/PromptRequest$Companion { public final class com/agentclientprotocol/model/PromptResponse : com/agentclientprotocol/model/AcpResponse { public static final field Companion Lcom/agentclientprotocol/model/PromptResponse$Companion; - public fun (Lcom/agentclientprotocol/model/StopReason;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (Lcom/agentclientprotocol/model/StopReason;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/StopReason;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/StopReason;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lcom/agentclientprotocol/model/StopReason; - public final fun component2 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy (Lcom/agentclientprotocol/model/StopReason;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PromptResponse; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/PromptResponse;Lcom/agentclientprotocol/model/StopReason;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PromptResponse; + public final fun component2-f2XpNSU ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy-5MJPFCQ (Lcom/agentclientprotocol/model/StopReason;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PromptResponse; + public static synthetic fun copy-5MJPFCQ$default (Lcom/agentclientprotocol/model/PromptResponse;Lcom/agentclientprotocol/model/StopReason;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PromptResponse; public fun equals (Ljava/lang/Object;)Z public final fun getStopReason ()Lcom/agentclientprotocol/model/StopReason; + public final fun getUserMessageId-f2XpNSU ()Ljava/lang/String; public fun get_meta ()Lkotlinx/serialization/json/JsonElement; public fun hashCode ()I public fun toString ()Ljava/lang/String; @@ -3125,12 +3159,15 @@ public abstract class com/agentclientprotocol/model/SessionUpdate { public final class com/agentclientprotocol/model/SessionUpdate$AgentMessageChunk : com/agentclientprotocol/model/SessionUpdate { public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk$Companion; - public fun (Lcom/agentclientprotocol/model/ContentBlock;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lcom/agentclientprotocol/model/ContentBlock; - public final fun copy (Lcom/agentclientprotocol/model/ContentBlock;)Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk;Lcom/agentclientprotocol/model/ContentBlock;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk; + public final fun component2-f2XpNSU ()Ljava/lang/String; + public final fun copy-eVVbJIE (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk; + public static synthetic fun copy-eVVbJIE$default (Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk;Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$AgentMessageChunk; public fun equals (Ljava/lang/Object;)Z public final fun getContent ()Lcom/agentclientprotocol/model/ContentBlock; + public final fun getMessageId-f2XpNSU ()Ljava/lang/String; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -3152,12 +3189,15 @@ public final class com/agentclientprotocol/model/SessionUpdate$AgentMessageChunk public final class com/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk : com/agentclientprotocol/model/SessionUpdate { public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk$Companion; - public fun (Lcom/agentclientprotocol/model/ContentBlock;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lcom/agentclientprotocol/model/ContentBlock; - public final fun copy (Lcom/agentclientprotocol/model/ContentBlock;)Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk;Lcom/agentclientprotocol/model/ContentBlock;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk; + public final fun component2-f2XpNSU ()Ljava/lang/String; + public final fun copy-eVVbJIE (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk; + public static synthetic fun copy-eVVbJIE$default (Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk;Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$AgentThoughtChunk; public fun equals (Ljava/lang/Object;)Z public final fun getContent ()Lcom/agentclientprotocol/model/ContentBlock; + public final fun getMessageId-f2XpNSU ()Ljava/lang/String; public fun hashCode ()I public fun toString ()Ljava/lang/String; } @@ -3484,12 +3524,15 @@ public final class com/agentclientprotocol/model/SessionUpdate$UsageUpdate$Compa public final class com/agentclientprotocol/model/SessionUpdate$UserMessageChunk : com/agentclientprotocol/model/SessionUpdate { public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk$Companion; - public fun (Lcom/agentclientprotocol/model/ContentBlock;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Lcom/agentclientprotocol/model/ContentBlock; - public final fun copy (Lcom/agentclientprotocol/model/ContentBlock;)Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk;Lcom/agentclientprotocol/model/ContentBlock;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk; + public final fun component2-f2XpNSU ()Ljava/lang/String; + public final fun copy-eVVbJIE (Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk; + public static synthetic fun copy-eVVbJIE$default (Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk;Lcom/agentclientprotocol/model/ContentBlock;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$UserMessageChunk; public fun equals (Ljava/lang/Object;)Z public final fun getContent ()Lcom/agentclientprotocol/model/ContentBlock; + public final fun getMessageId-f2XpNSU ()Ljava/lang/String; public fun hashCode ()I public fun toString ()Ljava/lang/String; } diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt index b1b76a8..9be7b04 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt @@ -398,10 +398,13 @@ public data class LoadSessionRequest( * * See protocol docs: [User Message](https://agentclientprotocol.com/protocol/prompt-turn#1-user-message) */ +@OptIn(UnstableApi::class) @Serializable public data class PromptRequest( override val sessionId: SessionId, val prompt: List, + @property:UnstableApi + val messageId: MessageId? = null, override val _meta: JsonElement? = null ) : AcpRequest, AcpWithSessionId @@ -566,9 +569,12 @@ public data class NewSessionResponse( * * See protocol docs: [Check for Completion](https://agentclientprotocol.com/protocol/prompt-turn#4-check-for-completion) */ +@OptIn(UnstableApi::class) @Serializable public data class PromptResponse( val stopReason: StopReason, + @property:UnstableApi + val userMessageId: MessageId? = null, override val _meta: JsonElement? = null ) : AcpResponse diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt index d300b36..cd8cbbe 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt @@ -87,28 +87,37 @@ public sealed class SessionUpdate { /** * A chunk of the user's message being streamed. */ + @OptIn(UnstableApi::class) @Serializable @SerialName("user_message_chunk") public data class UserMessageChunk( - val content: ContentBlock + val content: ContentBlock, + @property:UnstableApi + val messageId: MessageId? = null ) : SessionUpdate() /** * A chunk of the agent's response being streamed. */ + @OptIn(UnstableApi::class) @Serializable @SerialName("agent_message_chunk") public data class AgentMessageChunk( - val content: ContentBlock + val content: ContentBlock, + @property:UnstableApi + val messageId: MessageId? = null ) : SessionUpdate() /** * A chunk of the agent's internal reasoning being streamed. */ + @OptIn(UnstableApi::class) @Serializable @SerialName("agent_thought_chunk") public data class AgentThoughtChunk( - val content: ContentBlock + val content: ContentBlock, + @property:UnstableApi + val messageId: MessageId? = null ) : SessionUpdate() /** diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt index 1cabd21..9ed4673 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt @@ -130,6 +130,24 @@ public value class SessionConfigGroupId(public val value: String) { override fun toString(): String = value } +/** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + * + * A unique message identifier for [PromptRequest], session update message chunks, and [PromptResponse]. + * + * If provided by the client, the Agent SHOULD echo this value as `userMessageId` in the + * [PromptResponse] to confirm it was recorded. + * Both clients and agents MUST use UUID format for message IDs. + */ +@UnstableApi +@JvmInline +@Serializable +public value class MessageId(public val value: String) { + override fun toString(): String = value +} + /** * The sender or recipient of messages and data in a conversation. */ diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt index 312f177..17c210a 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt @@ -69,7 +69,7 @@ internal class ClientSessionImpl( } try { logger.trace { "Sending prompt request: $content" } - val promptResponse = AcpMethod.AgentMethods.SessionPrompt(protocol, PromptRequest(sessionId, content, _meta)) + val promptResponse = AcpMethod.AgentMethods.SessionPrompt(protocol, PromptRequest(sessionId, content, _meta = _meta)) logger.trace { "Received prompt response: $promptResponse" } // after receiving prompt response we immediately close the current prompt channel