Skip to content

Commit dac16a1

Browse files
authored
feat: add boolean session config option type (#69)
* feat: add boolean session config option type * feat: add UnknownValue type for session config options * feat: add deprecated overloads for setConfigOption using SessionConfigValueId and bump version to 0.16.0
1 parent ed32572 commit dac16a1

10 files changed

Lines changed: 541 additions & 21 deletions

File tree

acp-model/api/acp-model.api

Lines changed: 89 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2521,7 +2521,47 @@ public abstract class com/agentclientprotocol/model/SessionConfigOption : com/ag
25212521
public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/SessionConfigOption;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
25222522
}
25232523

2524+
public final class com/agentclientprotocol/model/SessionConfigOption$BooleanOption : com/agentclientprotocol/model/SessionConfigOption {
2525+
public static final field Companion Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption$Companion;
2526+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
2527+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
2528+
public final fun component1-2Q23AbI ()Ljava/lang/String;
2529+
public final fun component2 ()Ljava/lang/String;
2530+
public final fun component3 ()Ljava/lang/String;
2531+
public final fun component4 ()Z
2532+
public final fun component5 ()Lkotlinx/serialization/json/JsonElement;
2533+
public final fun copy-AHie1Zw (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;
2534+
public static synthetic fun copy-AHie1Zw$default (Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;
2535+
public fun equals (Ljava/lang/Object;)Z
2536+
public final fun getCurrentValue ()Z
2537+
public fun getDescription ()Ljava/lang/String;
2538+
public fun getId-2Q23AbI ()Ljava/lang/String;
2539+
public fun getName ()Ljava/lang/String;
2540+
public fun get_meta ()Lkotlinx/serialization/json/JsonElement;
2541+
public fun hashCode ()I
2542+
public fun toString ()Ljava/lang/String;
2543+
}
2544+
2545+
public final synthetic class com/agentclientprotocol/model/SessionConfigOption$BooleanOption$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
2546+
public static final field INSTANCE Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption$$serializer;
2547+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
2548+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;
2549+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
2550+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
2551+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;)V
2552+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
2553+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
2554+
}
2555+
2556+
public final class com/agentclientprotocol/model/SessionConfigOption$BooleanOption$Companion {
2557+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
2558+
}
2559+
25242560
public final class com/agentclientprotocol/model/SessionConfigOption$Companion {
2561+
public final fun boolean (Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;
2562+
public static synthetic fun boolean$default (Lcom/agentclientprotocol/model/SessionConfigOption$Companion;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOption$BooleanOption;
2563+
public final fun select (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigSelectOptions;Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionConfigOption$Select;
2564+
public static synthetic fun select$default (Lcom/agentclientprotocol/model/SessionConfigOption$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigSelectOptions;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOption$Select;
25252565
public final fun serializer ()Lkotlinx/serialization/KSerializer;
25262566
}
25272567

@@ -2563,6 +2603,49 @@ public final class com/agentclientprotocol/model/SessionConfigOption$Select$Comp
25632603
public final fun serializer ()Lkotlinx/serialization/KSerializer;
25642604
}
25652605

2606+
public abstract class com/agentclientprotocol/model/SessionConfigOptionValue {
2607+
public static final field Companion Lcom/agentclientprotocol/model/SessionConfigOptionValue$Companion;
2608+
}
2609+
2610+
public final class com/agentclientprotocol/model/SessionConfigOptionValue$BoolValue : com/agentclientprotocol/model/SessionConfigOptionValue {
2611+
public fun <init> (Z)V
2612+
public final fun component1 ()Z
2613+
public final fun copy (Z)Lcom/agentclientprotocol/model/SessionConfigOptionValue$BoolValue;
2614+
public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionConfigOptionValue$BoolValue;ZILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOptionValue$BoolValue;
2615+
public fun equals (Ljava/lang/Object;)Z
2616+
public final fun getValue ()Z
2617+
public fun hashCode ()I
2618+
public fun toString ()Ljava/lang/String;
2619+
}
2620+
2621+
public final class com/agentclientprotocol/model/SessionConfigOptionValue$Companion {
2622+
public final fun of (Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionConfigOptionValue;
2623+
public final fun of (Z)Lcom/agentclientprotocol/model/SessionConfigOptionValue;
2624+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
2625+
}
2626+
2627+
public final class com/agentclientprotocol/model/SessionConfigOptionValue$StringValue : com/agentclientprotocol/model/SessionConfigOptionValue {
2628+
public fun <init> (Ljava/lang/String;)V
2629+
public final fun component1 ()Ljava/lang/String;
2630+
public final fun copy (Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionConfigOptionValue$StringValue;
2631+
public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionConfigOptionValue$StringValue;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOptionValue$StringValue;
2632+
public fun equals (Ljava/lang/Object;)Z
2633+
public final fun getValue ()Ljava/lang/String;
2634+
public fun hashCode ()I
2635+
public fun toString ()Ljava/lang/String;
2636+
}
2637+
2638+
public final class com/agentclientprotocol/model/SessionConfigOptionValue$UnknownValue : com/agentclientprotocol/model/SessionConfigOptionValue {
2639+
public fun <init> (Lkotlinx/serialization/json/JsonElement;)V
2640+
public final fun component1 ()Lkotlinx/serialization/json/JsonElement;
2641+
public final fun copy (Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SessionConfigOptionValue$UnknownValue;
2642+
public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionConfigOptionValue$UnknownValue;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionConfigOptionValue$UnknownValue;
2643+
public fun equals (Ljava/lang/Object;)Z
2644+
public final fun getRawElement ()Lkotlinx/serialization/json/JsonElement;
2645+
public fun hashCode ()I
2646+
public fun toString ()Ljava/lang/String;
2647+
}
2648+
25662649
public final class com/agentclientprotocol/model/SessionConfigSelectGroup : com/agentclientprotocol/model/AcpWithMeta {
25672650
public static final field Companion Lcom/agentclientprotocol/model/SessionConfigSelectGroup$Companion;
25682651
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -3428,18 +3511,18 @@ public final class com/agentclientprotocol/model/SessionUpdate$UserMessageChunk$
34283511

34293512
public final class com/agentclientprotocol/model/SetSessionConfigOptionRequest : com/agentclientprotocol/model/AcpRequest, com/agentclientprotocol/model/AcpWithSessionId {
34303513
public static final field Companion Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest$Companion;
3431-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
3432-
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
3514+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigOptionValue;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
3515+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigOptionValue;Lkotlinx/serialization/json/JsonElement;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
34333516
public final fun component1-7EW-EgU ()Ljava/lang/String;
34343517
public final fun component2-2Q23AbI ()Ljava/lang/String;
3435-
public final fun component3-cDIbsdA ()Ljava/lang/String;
3518+
public final fun component3 ()Lcom/agentclientprotocol/model/SessionConfigOptionValue;
34363519
public final fun component4 ()Lkotlinx/serialization/json/JsonElement;
3437-
public final fun copy--I3Tswc (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;
3438-
public static synthetic fun copy--I3Tswc$default (Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;
3520+
public final fun copy-auAOz4E (Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigOptionValue;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;
3521+
public static synthetic fun copy-auAOz4E$default (Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;Ljava/lang/String;Ljava/lang/String;Lcom/agentclientprotocol/model/SessionConfigOptionValue;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SetSessionConfigOptionRequest;
34393522
public fun equals (Ljava/lang/Object;)Z
34403523
public final fun getConfigId-2Q23AbI ()Ljava/lang/String;
34413524
public fun getSessionId-7EW-EgU ()Ljava/lang/String;
3442-
public final fun getValue-cDIbsdA ()Ljava/lang/String;
3525+
public final fun getValue ()Lcom/agentclientprotocol/model/SessionConfigOptionValue;
34433526
public fun get_meta ()Lkotlinx/serialization/json/JsonElement;
34443527
public fun hashCode ()I
34453528
public fun toString ()Ljava/lang/String;

acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ public data class ResumeSessionResponse(
764764
public data class SetSessionConfigOptionRequest(
765765
override val sessionId: SessionId,
766766
val configId: SessionConfigId,
767-
val value: SessionConfigValueId,
767+
val value: SessionConfigOptionValue,
768768
override val _meta: JsonElement? = null
769769
) : AcpRequest, AcpWithSessionId
770770

acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionConfig.kt

Lines changed: 130 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@ import kotlinx.serialization.SerializationException
1111
import kotlinx.serialization.SerialName
1212
import kotlinx.serialization.Serializable
1313
import kotlinx.serialization.descriptors.SerialDescriptor
14+
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
1415
import kotlinx.serialization.builtins.ListSerializer
16+
import kotlinx.serialization.encoding.Decoder
17+
import kotlinx.serialization.encoding.Encoder
1518
import kotlinx.serialization.json.JsonClassDiscriminator
1619
import kotlinx.serialization.json.JsonArray
1720
import kotlinx.serialization.json.JsonDecoder
1821
import kotlinx.serialization.json.JsonElement
1922
import kotlinx.serialization.json.JsonEncoder
23+
import kotlinx.serialization.json.JsonPrimitive
24+
import kotlinx.serialization.json.boolean
25+
import kotlinx.serialization.json.booleanOrNull
2026
import kotlinx.serialization.json.jsonArray
2127
import kotlinx.serialization.json.jsonObject
2228

@@ -94,7 +100,7 @@ internal object SessionConfigSelectOptionsSerializer :
94100
override val descriptor: SerialDescriptor =
95101
ListSerializer(JsonElement.serializer()).descriptor
96102

97-
override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: SessionConfigSelectOptions) {
103+
override fun serialize(encoder: Encoder, value: SessionConfigSelectOptions) {
98104
val jsonEncoder = encoder as? JsonEncoder
99105
?: throw SerializationException("SessionConfigSelectOptionsSerializer supports only JSON")
100106
val json = jsonEncoder.json
@@ -109,7 +115,7 @@ internal object SessionConfigSelectOptionsSerializer :
109115
jsonEncoder.encodeJsonElement(JsonArray(elements))
110116
}
111117

112-
override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): SessionConfigSelectOptions {
118+
override fun deserialize(decoder: Decoder): SessionConfigSelectOptions {
113119
val jsonDecoder = decoder as? JsonDecoder
114120
?: throw SerializationException("SessionConfigSelectOptionsSerializer supports only JSON")
115121
val json = jsonDecoder.json
@@ -157,4 +163,126 @@ public sealed class SessionConfigOption : AcpWithMeta {
157163
val options: SessionConfigSelectOptions,
158164
override val _meta: JsonElement? = null
159165
) : SessionConfigOption()
166+
167+
/**
168+
* A boolean-type configuration option.
169+
*/
170+
@Serializable
171+
@SerialName("boolean")
172+
public data class BooleanOption(
173+
override val id: SessionConfigId,
174+
override val name: String,
175+
override val description: String? = null,
176+
val currentValue: Boolean,
177+
override val _meta: JsonElement? = null
178+
) : SessionConfigOption()
179+
180+
public companion object {
181+
/**
182+
* Creates a select-type configuration option.
183+
*/
184+
public fun select(
185+
id: String,
186+
name: String,
187+
currentValue: String,
188+
options: SessionConfigSelectOptions,
189+
description: String? = null,
190+
): Select = Select(
191+
id = SessionConfigId(id),
192+
name = name,
193+
description = description,
194+
currentValue = SessionConfigValueId(currentValue),
195+
options = options,
196+
)
197+
198+
/**
199+
* Creates a boolean-type configuration option.
200+
*/
201+
public fun boolean(
202+
id: String,
203+
name: String,
204+
currentValue: Boolean,
205+
description: String? = null,
206+
): BooleanOption = BooleanOption(
207+
id = SessionConfigId(id),
208+
name = name,
209+
description = description,
210+
currentValue = currentValue,
211+
)
212+
}
213+
}
214+
215+
/**
216+
* **UNSTABLE**
217+
*
218+
* This capability is not part of the spec yet, and may be removed or changed at any point.
219+
*
220+
* Represents a value that can be either a string (for select options) or a boolean (for boolean options).
221+
*/
222+
@UnstableApi
223+
@Serializable(with = SessionConfigOptionValueSerializer::class)
224+
public sealed class SessionConfigOptionValue {
225+
/**
226+
* A string value, used for select-type configuration options.
227+
*/
228+
public data class StringValue(val value: String) : SessionConfigOptionValue()
229+
230+
/**
231+
* A boolean value, used for boolean-type configuration options.
232+
*/
233+
public data class BoolValue(val value: Boolean) : SessionConfigOptionValue()
234+
235+
/**
236+
* An unknown value type, used for forward compatibility with future protocol extensions.
237+
* Contains the raw JSON element that could not be mapped to a known type.
238+
*/
239+
public data class UnknownValue(val rawElement: JsonElement) : SessionConfigOptionValue()
240+
241+
public companion object {
242+
/**
243+
* Creates a [StringValue] from the given string.
244+
*/
245+
public fun of(value: String): SessionConfigOptionValue = StringValue(value)
246+
247+
/**
248+
* Creates a [BoolValue] from the given boolean.
249+
*/
250+
public fun of(value: Boolean): SessionConfigOptionValue = BoolValue(value)
251+
}
252+
}
253+
254+
/**
255+
* **UNSTABLE**
256+
*
257+
* This capability is not part of the spec yet, and may be removed or changed at any point.
258+
*
259+
* Serializer for [SessionConfigOptionValue] that handles untagged string | boolean JSON values.
260+
*/
261+
@OptIn(UnstableApi::class)
262+
internal object SessionConfigOptionValueSerializer : KSerializer<SessionConfigOptionValue> {
263+
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("SessionConfigOptionValue")
264+
265+
override fun serialize(encoder: Encoder, value: SessionConfigOptionValue) {
266+
val jsonEncoder = encoder as? JsonEncoder
267+
?: throw SerializationException("SessionConfigOptionValueSerializer supports only JSON")
268+
when (value) {
269+
is SessionConfigOptionValue.StringValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value))
270+
is SessionConfigOptionValue.BoolValue -> jsonEncoder.encodeJsonElement(JsonPrimitive(value.value))
271+
is SessionConfigOptionValue.UnknownValue -> jsonEncoder.encodeJsonElement(value.rawElement)
272+
}
273+
}
274+
275+
override fun deserialize(decoder: Decoder): SessionConfigOptionValue {
276+
val jsonDecoder = decoder as? JsonDecoder
277+
?: throw SerializationException("SessionConfigOptionValueSerializer supports only JSON")
278+
val element = jsonDecoder.decodeJsonElement()
279+
if (element !is JsonPrimitive) {
280+
return SessionConfigOptionValue.UnknownValue(element)
281+
}
282+
return when {
283+
element.isString -> SessionConfigOptionValue.StringValue(element.content)
284+
element.booleanOrNull != null -> SessionConfigOptionValue.BoolValue(element.boolean)
285+
else -> SessionConfigOptionValue.UnknownValue(element)
286+
}
287+
}
160288
}

0 commit comments

Comments
 (0)