diff --git a/acp-model/api/acp-model.api b/acp-model/api/acp-model.api index d3a9ef0..f7af3f2 100644 --- a/acp-model/api/acp-model.api +++ b/acp-model/api/acp-model.api @@ -864,22 +864,24 @@ 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;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 fun (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/PlanCapabilities;Lcom/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/PlanCapabilities;Lcom/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 ()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 final fun component3 ()Lcom/agentclientprotocol/model/PlanCapabilities; + public final fun component4 ()Lcom/agentclientprotocol/model/AuthCapabilities; + public final fun component5 ()Lcom/agentclientprotocol/model/ClientNesCapabilities; + public final fun component6 ()Ljava/util/List; + public final fun component7 ()Lcom/agentclientprotocol/model/ElicitationCapabilities; + public final fun component8 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/FileSystemCapability;ZLcom/agentclientprotocol/model/PlanCapabilities;Lcom/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/PlanCapabilities;Lcom/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 getPlanCapabilities ()Lcom/agentclientprotocol/model/PlanCapabilities; public final fun getPositionEncodings ()Ljava/util/List; public final fun getTerminal ()Z public fun get_meta ()Lkotlinx/serialization/json/JsonElement; @@ -4738,6 +4740,35 @@ public final class com/agentclientprotocol/model/Plan$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/PlanCapabilities : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/PlanCapabilities$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/PlanCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/PlanCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PlanCapabilities; + 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/PlanCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/PlanCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/PlanCapabilities; + 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/PlanCapabilities;)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/PlanCapabilities$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/PlanEntry : com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/PlanEntry$Companion; public fun (Ljava/lang/String;Lcom/agentclientprotocol/model/PlanEntryPriority;Lcom/agentclientprotocol/model/PlanEntryStatus;Lkotlinx/serialization/json/JsonElement;)V @@ -4800,6 +4831,114 @@ public final class com/agentclientprotocol/model/PlanEntryStatus$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public abstract class com/agentclientprotocol/model/PlanVariant { + public static final field Companion Lcom/agentclientprotocol/model/PlanVariant$Companion; + public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V + public abstract fun getId ()Ljava/lang/String; + public abstract fun get_meta ()Lkotlinx/serialization/json/JsonElement; + public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/PlanVariant;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class com/agentclientprotocol/model/PlanVariant$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/PlanVariant$File : com/agentclientprotocol/model/PlanVariant, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/PlanVariant$File$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PlanVariant$File; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/PlanVariant$File;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PlanVariant$File; + public fun equals (Ljava/lang/Object;)Z + public fun getId ()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/PlanVariant$File$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/PlanVariant$File$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/PlanVariant$File; + 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/PlanVariant$File;)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/PlanVariant$File$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/PlanVariant$Items : com/agentclientprotocol/model/PlanVariant, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/PlanVariant$Items$Companion; + public fun (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/util/List; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PlanVariant$Items; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/PlanVariant$Items;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PlanVariant$Items; + public fun equals (Ljava/lang/Object;)Z + public final fun getEntries ()Ljava/util/List; + public fun getId ()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/PlanVariant$Items$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/PlanVariant$Items$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/PlanVariant$Items; + 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/PlanVariant$Items;)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/PlanVariant$Items$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/PlanVariant$Markdown : com/agentclientprotocol/model/PlanVariant, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/PlanVariant$Markdown$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/PlanVariant$Markdown; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/PlanVariant$Markdown;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/PlanVariant$Markdown; + public fun equals (Ljava/lang/Object;)Z + public final fun getContent ()Ljava/lang/String; + public fun getId ()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/PlanVariant$Markdown$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/PlanVariant$Markdown$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/PlanVariant$Markdown; + 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/PlanVariant$Markdown;)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/PlanVariant$Markdown$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/PositionEncodingKind : java/lang/Enum { public static final field Companion Lcom/agentclientprotocol/model/PositionEncodingKind$Companion; public static final field UTF_16 Lcom/agentclientprotocol/model/PositionEncodingKind; @@ -6360,6 +6499,36 @@ public final class com/agentclientprotocol/model/SessionUpdate$CurrentModeUpdate public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/SessionUpdate$PlanRemoved : com/agentclientprotocol/model/SessionUpdate, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved$Companion; + public fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved; + public fun equals (Ljava/lang/Object;)Z + public final fun getId ()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/SessionUpdate$PlanRemoved$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/SessionUpdate$PlanRemoved; + 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/SessionUpdate$PlanRemoved;)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/SessionUpdate$PlanRemoved$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/SessionUpdate$PlanUpdate : com/agentclientprotocol/model/SessionUpdate, com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdate$Companion; public fun (Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)V @@ -6390,6 +6559,36 @@ public final class com/agentclientprotocol/model/SessionUpdate$PlanUpdate$Compan public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/SessionUpdate$PlanUpdateV2 : com/agentclientprotocol/model/SessionUpdate, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2$Companion; + public fun (Lcom/agentclientprotocol/model/PlanVariant;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Lcom/agentclientprotocol/model/PlanVariant;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lcom/agentclientprotocol/model/PlanVariant; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Lcom/agentclientprotocol/model/PlanVariant;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2;Lcom/agentclientprotocol/model/PlanVariant;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2; + public fun equals (Ljava/lang/Object;)Z + public final fun getPlan ()Lcom/agentclientprotocol/model/PlanVariant; + 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/SessionUpdate$PlanUpdateV2$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/SessionUpdate$PlanUpdateV2; + 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/SessionUpdate$PlanUpdateV2;)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/SessionUpdate$PlanUpdateV2$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/SessionUpdate$SessionInfoUpdate : com/agentclientprotocol/model/SessionUpdate, com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/SessionUpdate$SessionInfoUpdate$Companion; public fun ()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 952eba2..6e1b8f9 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt @@ -54,6 +54,23 @@ public data class AuthCapabilities( override val _meta: JsonElement? = null ): AcpWithMeta +/** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + * + * Plan capabilities supported by the client. + * + * When present, signals that the client supports `plan_update` and `plan_removed` + * session update types. When absent, the agent must fall back to the existing + * `plan` session update type. + */ +@UnstableApi +@Serializable +public data class PlanCapabilities( + override val _meta: JsonElement? = null +) : AcpWithMeta + /** * Capabilities supported by the client. * @@ -68,6 +85,8 @@ public data class ClientCapabilities( @EncodeDefault val fs: FileSystemCapability? = null, @EncodeDefault val terminal: Boolean = false, @property:UnstableApi + val planCapabilities: PlanCapabilities? = null, + @property:UnstableApi @EncodeDefault val auth: AuthCapabilities? = null, @property:UnstableApi val nes: ClientNesCapabilities? = null, diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Plan.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Plan.kt index 1dc7d92..508691b 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Plan.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Plan.kt @@ -1,9 +1,13 @@ @file:Suppress("unused") +@file:OptIn(ExperimentalSerializationApi::class) package com.agentclientprotocol.model +import com.agentclientprotocol.annotations.UnstableApi +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonClassDiscriminator import kotlinx.serialization.json.JsonElement /** @@ -64,4 +68,56 @@ public data class PlanEntry( public data class Plan( val entries: List, override val _meta: JsonElement? = null -) : AcpWithMeta \ No newline at end of file +) : AcpWithMeta + +/** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + * + * A plan variant that supports multiple formats and plan identity. + * + * Used with the `plan_update` session update type to provide richer plan + * representations including structured items, file references, and markdown. + * Each variant carries a required `id` for tracking multiple concurrent plans. + */ +@UnstableApi +@Serializable +@JsonClassDiscriminator(TYPE_DISCRIMINATOR) +public sealed class PlanVariant { + public abstract val id: String + public abstract val _meta: JsonElement? + + /** + * Structured plan entries (same semantics as the existing `plan` session update). + */ + @Serializable + @SerialName("items") + public data class Items( + override val id: String, + val entries: List, + override val _meta: JsonElement? = null + ) : PlanVariant(), AcpWithMeta + + /** + * A plan provided as a file URI. + */ + @Serializable + @SerialName("file") + public data class File( + override val id: String, + val uri: String, + override val _meta: JsonElement? = null + ) : PlanVariant(), AcpWithMeta + + /** + * A plan provided as raw markdown text. + */ + @Serializable + @SerialName("markdown") + public data class Markdown( + override val id: String, + val content: String, + override val _meta: JsonElement? = null + ) : PlanVariant(), AcpWithMeta +} \ No newline at end of file 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 c3b28a5..e4a58a4 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt @@ -166,6 +166,44 @@ public sealed class SessionUpdate { override val _meta: JsonElement? = null ) : SessionUpdate(), AcpWithMeta + /** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + * + * A plan update that supports multiple plan formats and concurrent plans. + * + * Uses the `plan_update` session update type. Requires the client to advertise + * `planCapabilities` in `ClientCapabilities`. + * + * See [PlanVariant] for available plan formats. + */ + @UnstableApi + @Serializable + @SerialName("plan_update") + public data class PlanUpdateV2( + val plan: PlanVariant, + override val _meta: JsonElement? = null + ) : SessionUpdate(), AcpWithMeta + + /** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + * + * Signals that a plan has been dismissed/removed. + * + * Uses the `plan_removed` session update type. The `id` identifies + * which plan to remove. + */ + @UnstableApi + @Serializable + @SerialName("plan_removed") + public data class PlanRemoved( + val id: String, + override val _meta: JsonElement? = null + ) : SessionUpdate(), AcpWithMeta + /** * Available commands are ready or have changed */ @@ -301,6 +339,20 @@ internal object SessionUpdateSerializer : KSerializer { base.forEach { (k, v) -> put(k, v) } } } + is SessionUpdate.PlanUpdateV2 -> { + val base = ACPJson.encodeToJsonElement(SessionUpdate.PlanUpdateV2.serializer(), value).jsonObject + buildJsonObject { + put(SESSION_UPDATE_DISCRIMINATOR, "plan_update") + base.forEach { (k, v) -> put(k, v) } + } + } + is SessionUpdate.PlanRemoved -> { + val base = ACPJson.encodeToJsonElement(SessionUpdate.PlanRemoved.serializer(), value).jsonObject + buildJsonObject { + put(SESSION_UPDATE_DISCRIMINATOR, "plan_removed") + base.forEach { (k, v) -> put(k, v) } + } + } is SessionUpdate.AvailableCommandsUpdate -> { val base = ACPJson.encodeToJsonElement(SessionUpdate.AvailableCommandsUpdate.serializer(), value).jsonObject buildJsonObject { @@ -380,6 +432,14 @@ internal object SessionUpdateSerializer : KSerializer { SessionUpdate.PlanUpdate.serializer(), jsonObject ) + "plan_update" -> ACPJson.decodeFromJsonElement( + SessionUpdate.PlanUpdateV2.serializer(), + jsonObject + ) + "plan_removed" -> ACPJson.decodeFromJsonElement( + SessionUpdate.PlanRemoved.serializer(), + jsonObject + ) "available_commands_update" -> ACPJson.decodeFromJsonElement( SessionUpdate.AvailableCommandsUpdate.serializer(), jsonObject diff --git a/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SerializationTests.kt b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SerializationTests.kt index bcbf4fb..8afa3a8 100644 --- a/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SerializationTests.kt +++ b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SerializationTests.kt @@ -1,11 +1,14 @@ + package com.agentclientprotocol.model +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.rpc.ACPJson import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNull import kotlin.test.assertTrue +@OptIn(UnstableApi::class) class SerializationTests { @Test @@ -210,4 +213,48 @@ class SerializationTests { assertEquals(StopReason.END_TURN, response.stopReason) assertNull(response.usage) } + + @Test + fun `decodes ClientCapabilities with planCapabilities`() { + val payload = """ + { + "fs": {"readTextFile": true, "writeTextFile": false}, + "terminal": true, + "planCapabilities": {} + } + """.trimIndent() + + val capabilities = ACPJson.decodeFromString(ClientCapabilities.serializer(), payload) + + assertTrue(capabilities.planCapabilities != null) + assertTrue(capabilities.terminal) + } + + @Test + fun `decodes ClientCapabilities without planCapabilities`() { + val payload = """ + { + "fs": {"readTextFile": true, "writeTextFile": false}, + "terminal": false + } + """.trimIndent() + + val capabilities = ACPJson.decodeFromString(ClientCapabilities.serializer(), payload) + + assertNull(capabilities.planCapabilities) + } + + @Test + fun `round-trip serialization for ClientCapabilities with planCapabilities`() { + val original = ClientCapabilities( + terminal = true, + planCapabilities = PlanCapabilities() + ) + + val encoded = ACPJson.encodeToString(ClientCapabilities.serializer(), original) + assertTrue(encoded.contains("\"planCapabilities\"")) + + val decoded = ACPJson.decodeFromString(ClientCapabilities.serializer(), encoded) + assertTrue(decoded.planCapabilities != null) + } } diff --git a/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SessionUpdateSerializerTest.kt b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SessionUpdateSerializerTest.kt index 8e18318..285e5ed 100644 --- a/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SessionUpdateSerializerTest.kt +++ b/acp-model/src/commonTest/kotlin/com/agentclientprotocol/model/SessionUpdateSerializerTest.kt @@ -260,6 +260,10 @@ class SessionUpdateSerializerTest { """{"sessionUpdate": "tool_call", "toolCallId": "t1", "title": "test"}""", """{"sessionUpdate": "tool_call_update", "toolCallId": "t1"}""", """{"sessionUpdate": "plan", "entries": []}""", + """{"sessionUpdate": "plan_update", "plan": {"type": "items", "id": "p1", "entries": []}}""", + """{"sessionUpdate": "plan_update", "plan": {"type": "markdown", "id": "p2", "content": "# Plan"}}""", + """{"sessionUpdate": "plan_update", "plan": {"type": "file", "id": "p3", "uri": "file:///tmp/plan.md"}}""", + """{"sessionUpdate": "plan_removed", "id": "p1"}""", """{"sessionUpdate": "available_commands_update", "availableCommands": []}""", """{"sessionUpdate": "current_mode_update", "currentModeId": "m1"}""", """{"sessionUpdate": "config_option_update", "configOptions": []}""", @@ -272,4 +276,263 @@ class SessionUpdateSerializerTest { assertNotNull(update, "Failed to decode: $payload") } } + + // plan_update tests + + @Test + fun `decodes plan_update with items type`() { + val payload = """ + { + "sessionUpdate": "plan_update", + "plan": { + "type": "items", + "id": "plan-1", + "entries": [ + {"content": "Step 1", "priority": "high", "status": "pending"}, + {"content": "Step 2", "priority": "medium", "status": "in_progress"} + ] + } + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanUpdateV2) + val plan = update.plan + assertTrue(plan is PlanVariant.Items) + assertEquals("plan-1", plan.id) + assertEquals(2, plan.entries.size) + assertEquals("Step 1", plan.entries[0].content) + assertEquals(PlanEntryPriority.HIGH, plan.entries[0].priority) + assertEquals(PlanEntryStatus.PENDING, plan.entries[0].status) + assertEquals("Step 2", plan.entries[1].content) + assertEquals(PlanEntryStatus.IN_PROGRESS, plan.entries[1].status) + } + + @Test + fun `decodes plan_update with markdown type`() { + val payload = """ + { + "sessionUpdate": "plan_update", + "plan": { + "type": "markdown", + "id": "plan-md", + "content": "## Steps\n- [ ] Refactor module\n- [ ] Add tests" + } + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanUpdateV2) + val plan = update.plan + assertTrue(plan is PlanVariant.Markdown) + assertEquals("plan-md", plan.id) + assertEquals("## Steps\n- [ ] Refactor module\n- [ ] Add tests", plan.content) + } + + @Test + fun `decodes plan_update with file type`() { + val payload = """ + { + "sessionUpdate": "plan_update", + "plan": { + "type": "file", + "id": "design-doc", + "uri": "file:///tmp/plan.md" + } + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanUpdateV2) + val plan = update.plan + assertTrue(plan is PlanVariant.File) + assertEquals("design-doc", plan.id) + assertEquals("file:///tmp/plan.md", plan.uri) + } + + @Test + fun `decodes plan_update with _meta on both update and plan`() { + val payload = """ + { + "sessionUpdate": "plan_update", + "plan": { + "type": "items", + "id": "plan-1", + "entries": [], + "_meta": {"planVersion": 2} + }, + "_meta": {"source": "agent"} + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanUpdateV2) + assertNotNull(update._meta) + assertNotNull(update.plan._meta) + } + + @Test + fun `decodes plan_removed`() { + val payload = """ + { + "sessionUpdate": "plan_removed", + "id": "plan-1" + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanRemoved) + assertEquals("plan-1", update.id) + } + + @Test + fun `decodes plan_removed with _meta`() { + val payload = """ + { + "sessionUpdate": "plan_removed", + "id": "plan-1", + "_meta": {"reason": "completed"} + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + + assertTrue(update is SessionUpdate.PlanRemoved) + assertEquals("plan-1", update.id) + assertNotNull(update._meta) + } + + @Test + fun `round-trip serialization for plan_update items`() { + val original = SessionUpdate.PlanUpdateV2( + plan = PlanVariant.Items( + id = "plan-1", + entries = listOf( + PlanEntry(content = "Step 1", priority = PlanEntryPriority.HIGH, status = PlanEntryStatus.PENDING) + ) + ) + ) + + val encoded = ACPJson.encodeToString(SessionUpdate.serializer(), original) + assertTrue(encoded.contains("\"sessionUpdate\":\"plan_update\"")) + assertTrue(encoded.contains("\"type\":\"items\"")) + assertTrue(encoded.contains("\"id\":\"plan-1\"")) + + val decoded = ACPJson.decodeFromString(SessionUpdate.serializer(), encoded) + assertTrue(decoded is SessionUpdate.PlanUpdateV2) + val plan = decoded.plan + assertTrue(plan is PlanVariant.Items) + assertEquals("plan-1", plan.id) + assertEquals(1, plan.entries.size) + } + + @Test + fun `round-trip serialization for plan_update markdown`() { + val original = SessionUpdate.PlanUpdateV2( + plan = PlanVariant.Markdown( + id = "md-plan", + content = "# My Plan\n- Do things" + ) + ) + + val encoded = ACPJson.encodeToString(SessionUpdate.serializer(), original) + assertTrue(encoded.contains("\"sessionUpdate\":\"plan_update\"")) + + val decoded = ACPJson.decodeFromString(SessionUpdate.serializer(), encoded) + assertTrue(decoded is SessionUpdate.PlanUpdateV2) + val plan = decoded.plan + assertTrue(plan is PlanVariant.Markdown) + assertEquals("md-plan", plan.id) + assertEquals("# My Plan\n- Do things", plan.content) + } + + @Test + fun `round-trip serialization for plan_update file`() { + val original = SessionUpdate.PlanUpdateV2( + plan = PlanVariant.File( + id = "file-plan", + uri = "file:///tmp/plan.md" + ) + ) + + val encoded = ACPJson.encodeToString(SessionUpdate.serializer(), original) + assertTrue(encoded.contains("\"sessionUpdate\":\"plan_update\"")) + + val decoded = ACPJson.decodeFromString(SessionUpdate.serializer(), encoded) + assertTrue(decoded is SessionUpdate.PlanUpdateV2) + val plan = decoded.plan + assertTrue(plan is PlanVariant.File) + assertEquals("file-plan", plan.id) + assertEquals("file:///tmp/plan.md", plan.uri) + } + + @Test + fun `round-trip serialization for plan_removed`() { + val original = SessionUpdate.PlanRemoved(id = "plan-1") + + val encoded = ACPJson.encodeToString(SessionUpdate.serializer(), original) + assertTrue(encoded.contains("\"sessionUpdate\":\"plan_removed\"")) + assertTrue(encoded.contains("\"id\":\"plan-1\"")) + + val decoded = ACPJson.decodeFromString(SessionUpdate.serializer(), encoded) + assertTrue(decoded is SessionUpdate.PlanRemoved) + assertEquals("plan-1", decoded.id) + } + + @Test + fun `plan_update and plan_removed in SessionNotification`() { + val planUpdatePayload = """ + { + "sessionId": "session-789", + "update": { + "sessionUpdate": "plan_update", + "plan": { + "type": "markdown", + "id": "plan-1", + "content": "# Plan" + } + } + } + """.trimIndent() + + val notification = ACPJson.decodeFromString(SessionNotification.serializer(), planUpdatePayload) + assertEquals("session-789", notification.sessionId.value) + assertTrue(notification.update is SessionUpdate.PlanUpdateV2) + + val planRemovedPayload = """ + { + "sessionId": "session-789", + "update": { + "sessionUpdate": "plan_removed", + "id": "plan-1" + } + } + """.trimIndent() + + val notification2 = ACPJson.decodeFromString(SessionNotification.serializer(), planRemovedPayload) + assertTrue(notification2.update is SessionUpdate.PlanRemoved) + assertEquals("plan-1", (notification2.update as SessionUpdate.PlanRemoved).id) + } + + @Test + fun `existing plan session update still works unchanged`() { + val payload = """ + { + "sessionUpdate": "plan", + "entries": [ + {"content": "Step 1", "priority": "high", "status": "pending"} + ] + } + """.trimIndent() + + val update = ACPJson.decodeFromString(SessionUpdate.serializer(), payload) + assertTrue(update is SessionUpdate.PlanUpdate) + assertEquals(1, update.entries.size) + assertEquals("Step 1", update.entries[0].content) + } } diff --git a/build.gradle.kts b/build.gradle.kts index ce8004f..da9c022 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.23.0" +private val baseVersion = "0.24.0" allprojects { group = "com.agentclientprotocol" diff --git a/samples/kotlin-acp-client-sample/src/main/kotlin/com/agentclientprotocol/samples/util.kt b/samples/kotlin-acp-client-sample/src/main/kotlin/com/agentclientprotocol/samples/util.kt index 4d36884..80474dc 100644 --- a/samples/kotlin-acp-client-sample/src/main/kotlin/com/agentclientprotocol/samples/util.kt +++ b/samples/kotlin-acp-client-sample/src/main/kotlin/com/agentclientprotocol/samples/util.kt @@ -1,8 +1,11 @@ package com.agentclientprotocol.samples +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.model.ContentBlock +import com.agentclientprotocol.model.PlanVariant import com.agentclientprotocol.model.SessionUpdate +@OptIn(UnstableApi::class) fun SessionUpdate.render() { when (this) { is SessionUpdate.AgentMessageChunk -> { @@ -52,6 +55,23 @@ fun SessionUpdate.render() { println("Usage update: used=${this.used}, size=${this.size}, cost=${this.cost?.amount} ${this.cost?.currency ?: ""}") } + is SessionUpdate.PlanUpdateV2 -> { + println("Plan update (${this.plan.id}):") + when (val plan = this.plan) { + is PlanVariant.Items -> { + for (entry in plan.entries) { + println(" [${entry.status}] ${entry.content} (${entry.priority})") + } + } + is PlanVariant.File -> println(" File: ${plan.uri}") + is PlanVariant.Markdown -> println(" ${plan.content}") + } + } + + is SessionUpdate.PlanRemoved -> { + println("Plan removed: ${this.id}") + } + is SessionUpdate.UnknownSessionUpdate -> { println("Unknown session update: ${this.sessionUpdateType}") }