diff --git a/.claude/schema-sync.md b/.claude/schema-sync.md new file mode 100644 index 0000000..5878d70 --- /dev/null +++ b/.claude/schema-sync.md @@ -0,0 +1,104 @@ +# Schema Synchronization + +Instructions for updating the model files to match the latest ACP schema from https://github.com/agentclientprotocol/agent-client-protocol + +## Process + +### 1. Fetch Latest Schema Files + +Schema URLs: +- https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/schema.json +- https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/meta.json +- https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/schema.unstable.json +- https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/meta.unstable.json + +### 2. Analyze Schema Changes + +Use the Task agent to analyze and compare schemas: +- Read the JSON schema files (large files, read in sections) +- Identify all types, requests, responses, and notifications +- Compare with `acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/` +- Find missing types, fields, or methods +- Identify items marked as "unstable" in schema + +### 3. Update Model Files + +Key files in `acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/`: +- `Types.kt` - Core types and value classes +- `Capabilities.kt` - Client and Agent capabilities +- `Requests.kt` - Request and Response types +- `SessionUpdate.kt` - Session update types +- `ToolCall.kt` - Tool call related types +- `Terminal.kt` - Terminal related types +- `Methods.kt` - AcpMethod enum with all protocol methods + +Rules: +- Mark unstable API with `@UnstableApi` annotation +- If a type is marked `@UnstableApi`, don't mark its methods +- Add `_meta: JsonElement?` field to types extending `AcpWithMeta` +- Use `@EncodeDefault` for optional fields with defaults in capabilities +- Use `@JsonClassDiscriminator` for sealed classes + +### 4. Update Agent/Client Integration + +If request/response signatures changed: +- `acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt` +- `acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentInfo.kt` +- `acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt` +- `acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientInfo.kt` + +### 5. Update API Dumps + +Run: `./gradlew :acp-model:apiDump :acp:apiDump :acp-ktor:apiDump :acp-ktor-client:apiDump :acp-ktor-server:apiDump` + +### 6. Update Schema Version Markers + +Clone schema repo to get metadata: +- Repository: https://github.com/agentclientprotocol/agent-client-protocol +- Get commit hash, date, and SHA256 checksums of schema files + +Update in `acp-model/`: +- `SCHEMA_VERSION.md` - commit hash, date, checksums, changelog +- `.schema-checksums` - SHA256 checksums for all 4 schema files +- `.schema-revision` - commit hash + +### 7. Verify Build + +Run: `./gradlew build` + +## Code Patterns + +### New Type +```kotlin +@Serializable +public data class NewType( + val requiredField: String, + val optionalField: String? = null, + override val _meta: JsonElement? = null +) : AcpWithMeta +``` + +### Unstable API +```kotlin +/** + * **UNSTABLE** + * + * This capability is not part of the spec yet, and may be removed or changed at any point. + */ +@UnstableApi +@Serializable +public data class UnstableType( + val field: String, + override val _meta: JsonElement? = null +) : AcpWithMeta +``` + +### New Method +```kotlin +// In Methods.kt +public object NewMethod : AcpRequestResponseMethod( + "method/name", + NewRequest.serializer(), + NewResponse.serializer() +) +``` diff --git a/acp-model/.schema-checksums b/acp-model/.schema-checksums new file mode 100644 index 0000000..b55fb0b --- /dev/null +++ b/acp-model/.schema-checksums @@ -0,0 +1,11 @@ +# ACP Schema Checksums +# This file is used for automated verification +# Format: SHA256 FILENAME + +# Stable schemas +796e38e275a1587b5a711a4b4508cb69825448b70e79b14bdb4256b24688b89d schema/schema.json +f242b95def9a9cbfddd2db1a45d8d3d489ad1b4f564a1322547c90a94c647637 schema/meta.json + +# Unstable schemas +4a886716877f97bc24c4c7f1ae24c9ad06a779107afbdf0718110fc50b5135b7 schema/schema.unstable.json +8ad80116767e0921970b28766c214d7921268653544d5996a8e2814e1244d4d2 schema/meta.unstable.json diff --git a/acp-model/.schema-revision b/acp-model/.schema-revision new file mode 100644 index 0000000..d668dd8 --- /dev/null +++ b/acp-model/.schema-revision @@ -0,0 +1 @@ +e23620fe29cb24555db8fb8b58b641b680788e5f diff --git a/acp-model/SCHEMA_VERSION.md b/acp-model/SCHEMA_VERSION.md new file mode 100644 index 0000000..e2004f7 --- /dev/null +++ b/acp-model/SCHEMA_VERSION.md @@ -0,0 +1,70 @@ +# ACP Schema Version + +This file tracks the version of the Agent Client Protocol schema that the model classes are based on. + +## Schema Source +- Repository: https://github.com/agentclientprotocol/agent-client-protocol +- Branch: main +- Release: v0.9.1 + +## Schema Files + +### Stable Schema +- **schema.json** + - Commit: `e23620fe29cb24555db8fb8b58b641b680788e5f` + - Date: 2025-12-01 17:17:19 +0100 + - SHA256: `796e38e275a1587b5a711a4b4508cb69825448b70e79b14bdb4256b24688b89d` + - URL: https://github.com/agentclientprotocol/agent-client-protocol/blob/main/schema/schema.json + +- **meta.json** + - Commit: `e23620fe29cb24555db8fb8b58b641b680788e5f` + - Date: 2025-12-01 17:17:19 +0100 + - SHA256: `f242b95def9a9cbfddd2db1a45d8d3d489ad1b4f564a1322547c90a94c647637` + - URL: https://github.com/agentclientprotocol/agent-client-protocol/blob/main/schema/meta.json + +### Unstable Schema +- **schema.unstable.json** + - Commit: `e23620fe29cb24555db8fb8b58b641b680788e5f` + - Date: 2025-12-01 17:17:19 +0100 + - SHA256: `4a886716877f97bc24c4c7f1ae24c9ad06a779107afbdf0718110fc50b5135b7` + - URL: https://github.com/agentclientprotocol/agent-client-protocol/blob/main/schema/schema.unstable.json + +- **meta.unstable.json** + - Commit: `e23620fe29cb24555db8fb8b58b641b680788e5f` + - Date: 2025-12-01 17:17:19 +0100 + - SHA256: `8ad80116767e0921970b28766c214d7921268653544d5996a8e2814e1244d4d2` + - URL: https://github.com/agentclientprotocol/agent-client-protocol/blob/main/schema/meta.unstable.json + +**Note:** All types from unstable schema must be marked with `@UnstableApi` annotation. + +## Last Updated +- Date: 2025-12-01 +- Updated by: Manual schema synchronization + +## Changes in This Version +- Added `Implementation` type for client/agent identification +- Added `SessionCapabilities` type (empty, for future expansion) +- Added `clientInfo` field to `InitializeRequest` +- Added `agentInfo` field to `InitializeResponse` +- Added `sessionCapabilities` field to `AgentCapabilities` +- Changed `AvailableCommandInput` from data class to sealed class with `Unstructured` variant +- Added `_meta` field to `ToolCallContent.Terminal` +- Terminal types are now stable (removed unstable warning) + +## Verification +To verify the schema files match: +```bash +# Stable schemas +curl -s https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/schema.json | sha256sum +# Expected: 796e38e275a1587b5a711a4b4508cb69825448b70e79b14bdb4256b24688b89d + +curl -s https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/meta.json | sha256sum +# Expected: f242b95def9a9cbfddd2db1a45d8d3d489ad1b4f564a1322547c90a94c647637 + +# Unstable schemas +curl -s https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/schema.unstable.json | sha256sum +# Expected: 4a886716877f97bc24c4c7f1ae24c9ad06a779107afbdf0718110fc50b5135b7 + +curl -s https://raw.githubusercontent.com/agentclientprotocol/agent-client-protocol/main/schema/meta.unstable.json | sha256sum +# Expected: 8ad80116767e0921970b28766c214d7921268653544d5996a8e2814e1244d4d2 +``` diff --git a/acp-model/api/acp-model.api b/acp-model/api/acp-model.api index 7de8868..0861988 100644 --- a/acp-model/api/acp-model.api +++ b/acp-model/api/acp-model.api @@ -2,6 +2,9 @@ public final class com/agentclientprotocol/acpmodel/LibVersionKt { public static final field LIB_VERSION Ljava/lang/String; } +public abstract interface annotation class com/agentclientprotocol/annotations/UnstableApi : java/lang/annotation/Annotation { +} + public abstract interface class com/agentclientprotocol/model/AcpCapabilities { } @@ -143,18 +146,20 @@ public abstract interface class com/agentclientprotocol/model/AcpWithSessionId { public final class com/agentclientprotocol/model/AgentCapabilities : com/agentclientprotocol/model/AcpCapabilities, com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/AgentCapabilities$Companion; public fun ()V - public fun (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lcom/agentclientprotocol/model/SessionCapabilities;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lcom/agentclientprotocol/model/SessionCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Z public final fun component2 ()Lcom/agentclientprotocol/model/PromptCapabilities; public final fun component3 ()Lcom/agentclientprotocol/model/McpCapabilities; - public final fun component4 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/AgentCapabilities; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/AgentCapabilities;ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/AgentCapabilities; + public final fun component4 ()Lcom/agentclientprotocol/model/SessionCapabilities; + public final fun component5 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lcom/agentclientprotocol/model/SessionCapabilities;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/AgentCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/AgentCapabilities;ZLcom/agentclientprotocol/model/PromptCapabilities;Lcom/agentclientprotocol/model/McpCapabilities;Lcom/agentclientprotocol/model/SessionCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/AgentCapabilities; public fun equals (Ljava/lang/Object;)Z public final fun getLoadSession ()Z public final fun getMcpCapabilities ()Lcom/agentclientprotocol/model/McpCapabilities; public final fun getPromptCapabilities ()Lcom/agentclientprotocol/model/PromptCapabilities; + public final fun getSessionCapabilities ()Lcom/agentclientprotocol/model/SessionCapabilities; public fun get_meta ()Lkotlinx/serialization/json/JsonElement; public fun hashCode ()I public fun toString ()Ljava/lang/String; @@ -367,30 +372,43 @@ public final class com/agentclientprotocol/model/AvailableCommand$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/AvailableCommandInput { +public abstract class com/agentclientprotocol/model/AvailableCommandInput { public static final field Companion Lcom/agentclientprotocol/model/AvailableCommandInput$Companion; - public fun (Ljava/lang/String;)V + public synthetic fun (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V + public static final synthetic fun write$Self (Lcom/agentclientprotocol/model/AvailableCommandInput;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V +} + +public final class com/agentclientprotocol/model/AvailableCommandInput$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class com/agentclientprotocol/model/AvailableCommandInput$Unstructured : com/agentclientprotocol/model/AvailableCommandInput, com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured$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 copy (Ljava/lang/String;)Lcom/agentclientprotocol/model/AvailableCommandInput; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/AvailableCommandInput;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/AvailableCommandInput; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured; public fun equals (Ljava/lang/Object;)Z public final fun getHint ()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/AvailableCommandInput$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lcom/agentclientprotocol/model/AvailableCommandInput$$serializer; +public final synthetic class com/agentclientprotocol/model/AvailableCommandInput$Unstructured$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured$$serializer; public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/AvailableCommandInput; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured; 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/AvailableCommandInput;)V + public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/agentclientprotocol/model/AvailableCommandInput$Unstructured;)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/AvailableCommandInput$Companion { +public final class com/agentclientprotocol/model/AvailableCommandInput$Unstructured$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } @@ -945,17 +963,53 @@ public final class com/agentclientprotocol/model/HttpHeader$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/Implementation : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/Implementation$Companion; + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (Ljava/lang/String;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 ()Ljava/lang/String; + public final fun component4 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/Implementation; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/Implementation;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/Implementation; + public fun equals (Ljava/lang/Object;)Z + public final fun getName ()Ljava/lang/String; + public final fun getTitle ()Ljava/lang/String; + public final fun getVersion ()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/Implementation$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/Implementation$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/Implementation; + 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/Implementation;)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/Implementation$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/InitializeRequest : com/agentclientprotocol/model/AcpRequest { public static final field Companion Lcom/agentclientprotocol/model/InitializeRequest$Companion; - public fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()I public final fun component2 ()Lcom/agentclientprotocol/model/ClientCapabilities; - public final fun component3 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy (ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/InitializeRequest; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/InitializeRequest;ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/InitializeRequest; + public final fun component3 ()Lcom/agentclientprotocol/model/Implementation; + public final fun component4 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/InitializeRequest; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/InitializeRequest;ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/InitializeRequest; public fun equals (Ljava/lang/Object;)Z public final fun getClientCapabilities ()Lcom/agentclientprotocol/model/ClientCapabilities; + public final fun getClientInfo ()Lcom/agentclientprotocol/model/Implementation; public final fun getProtocolVersion ()I public fun get_meta ()Lkotlinx/serialization/json/JsonElement; public fun hashCode ()I @@ -979,16 +1033,18 @@ public final class com/agentclientprotocol/model/InitializeRequest$Companion { public final class com/agentclientprotocol/model/InitializeResponse : com/agentclientprotocol/model/AcpResponse { public static final field Companion Lcom/agentclientprotocol/model/InitializeResponse$Companion; - public fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()I public final fun component2 ()Lcom/agentclientprotocol/model/AgentCapabilities; public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lkotlinx/serialization/json/JsonElement; - public final fun copy (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/InitializeResponse; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/InitializeResponse;ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/InitializeResponse; + public final fun component4 ()Lcom/agentclientprotocol/model/Implementation; + public final fun component5 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/InitializeResponse; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/InitializeResponse;ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/InitializeResponse; public fun equals (Ljava/lang/Object;)Z public final fun getAgentCapabilities ()Lcom/agentclientprotocol/model/AgentCapabilities; + public final fun getAgentInfo ()Lcom/agentclientprotocol/model/Implementation; public final fun getAuthMethods ()Ljava/util/List; public final fun getProtocolVersion ()I public fun get_meta ()Lkotlinx/serialization/json/JsonElement; @@ -1964,6 +2020,35 @@ public final class com/agentclientprotocol/model/Role$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class com/agentclientprotocol/model/SessionCapabilities : com/agentclientprotocol/model/AcpWithMeta { + public static final field Companion Lcom/agentclientprotocol/model/SessionCapabilities$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/SessionCapabilities; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/SessionCapabilities;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/SessionCapabilities; + 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/SessionCapabilities$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lcom/agentclientprotocol/model/SessionCapabilities$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/agentclientprotocol/model/SessionCapabilities; + 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/SessionCapabilities;)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/SessionCapabilities$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class com/agentclientprotocol/model/SessionId { public static final field Companion Lcom/agentclientprotocol/model/SessionId$Companion; public static final synthetic fun box-impl (Ljava/lang/String;)Lcom/agentclientprotocol/model/SessionId; @@ -2724,14 +2809,17 @@ public final class com/agentclientprotocol/model/ToolCallContent$Diff$Companion public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class com/agentclientprotocol/model/ToolCallContent$Terminal : com/agentclientprotocol/model/ToolCallContent { +public final class com/agentclientprotocol/model/ToolCallContent$Terminal : com/agentclientprotocol/model/ToolCallContent, com/agentclientprotocol/model/AcpWithMeta { public static final field Companion Lcom/agentclientprotocol/model/ToolCallContent$Terminal$Companion; - public fun (Ljava/lang/String;)V + 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 copy (Ljava/lang/String;)Lcom/agentclientprotocol/model/ToolCallContent$Terminal; - public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ToolCallContent$Terminal;Ljava/lang/String;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ToolCallContent$Terminal; + public final fun component2 ()Lkotlinx/serialization/json/JsonElement; + public final fun copy (Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;)Lcom/agentclientprotocol/model/ToolCallContent$Terminal; + public static synthetic fun copy$default (Lcom/agentclientprotocol/model/ToolCallContent$Terminal;Ljava/lang/String;Lkotlinx/serialization/json/JsonElement;ILjava/lang/Object;)Lcom/agentclientprotocol/model/ToolCallContent$Terminal; public fun equals (Ljava/lang/Object;)Z public final fun getTerminalId ()Ljava/lang/String; + public fun get_meta ()Lkotlinx/serialization/json/JsonElement; public fun hashCode ()I public fun toString ()Ljava/lang/String; } diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/annotations/UnstableApi.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/annotations/UnstableApi.kt new file mode 100644 index 0000000..9caf2b5 --- /dev/null +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/annotations/UnstableApi.kt @@ -0,0 +1,8 @@ +package com.agentclientprotocol.annotations + +@RequiresOptIn( + message = "This API is unstable and may change in the future", + level = RequiresOptIn.Level.WARNING +) +@Retention(AnnotationRetention.BINARY) +public annotation class UnstableApi() \ No newline at end of file diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/AcpCreatedSessionResponse.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/AcpCreatedSessionResponse.kt index af43fbe..91dcccf 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/AcpCreatedSessionResponse.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/AcpCreatedSessionResponse.kt @@ -1,6 +1,9 @@ package com.agentclientprotocol.model +import com.agentclientprotocol.annotations.UnstableApi + public interface AcpCreatedSessionResponse : AcpWithMeta { public val modes: SessionModeState? + @UnstableApi public val models: SessionModelState? } \ No newline at end of file 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 f069095..a06c3e7 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Capabilities.kt @@ -61,6 +61,16 @@ public data class McpCapabilities( override val _meta: JsonElement? = null ) : AcpWithMeta +/** + * Session capabilities supported by the agent. + * + * Currently empty but extensible for future session-related capabilities. + */ +@Serializable +public data class SessionCapabilities( + override val _meta: JsonElement? = null +) : AcpWithMeta + /** * Capabilities supported by the agent. * @@ -74,5 +84,6 @@ public data class AgentCapabilities( @EncodeDefault val loadSession: Boolean = false, @EncodeDefault val promptCapabilities: PromptCapabilities = PromptCapabilities(), @EncodeDefault val mcpCapabilities: McpCapabilities = McpCapabilities(), + @EncodeDefault val sessionCapabilities: SessionCapabilities = SessionCapabilities(), override val _meta: JsonElement? = null ) : AcpCapabilities, AcpWithMeta \ No newline at end of file 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 b5eadf8..e39fb2a 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Methods.kt @@ -2,6 +2,7 @@ package com.agentclientprotocol.model +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.rpc.MethodName import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer @@ -50,6 +51,7 @@ public open class AcpMethod(public val methodName: MethodName) { public object SessionPrompt : AcpSessionRequestResponseMethod("session/prompt", PromptRequest.serializer(), PromptResponse.serializer()) public object SessionCancel : AcpSessionNotificationMethod("session/cancel", CancelNotification.serializer()) public object SessionSetMode : AcpSessionRequestResponseMethod("session/set_mode", SetSessionModeRequest.serializer(), SetSessionModeResponse.serializer()) + @UnstableApi public object SessionSetModel : AcpSessionRequestResponseMethod("session/set_model", SetSessionModelRequest.serializer(), SetSessionModelResponse.serializer()) } 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 b976388..fd530d5 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Requests.kt @@ -3,6 +3,7 @@ package com.agentclientprotocol.model +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.rpc.RequestId import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName @@ -168,6 +169,7 @@ public sealed class RequestPermissionOutcome { public data class InitializeRequest( val protocolVersion: ProtocolVersion, val clientCapabilities: ClientCapabilities = ClientCapabilities(), + val clientInfo: Implementation? = null, override val _meta: JsonElement? = null ) : AcpRequest @@ -282,6 +284,7 @@ public data class SetSessionModeRequest( * * Request parameters for setting a session model. */ +@UnstableApi @Serializable public data class SetSessionModelRequest( override val sessionId: SessionId, @@ -303,6 +306,7 @@ public data class InitializeResponse( val protocolVersion: ProtocolVersion, val agentCapabilities: AgentCapabilities = AgentCapabilities(), val authMethods: List = emptyList(), + val agentInfo: Implementation? = null, override val _meta: JsonElement? = null ) : AcpResponse @@ -336,6 +340,7 @@ public data class SessionModeState( * * Information about a selectable model. */ +@UnstableApi @Serializable public data class ModelInfo( val modelId: ModelId, @@ -351,6 +356,7 @@ public data class ModelInfo( * * The set of models and the one currently active. */ +@UnstableApi @Serializable public data class SessionModelState( val currentModelId: ModelId, @@ -433,6 +439,7 @@ public data class SetSessionModeResponse( * * Response to `session/set_model` method. */ +@UnstableApi @Serializable public data class SetSessionModelResponse( override val _meta: JsonElement? = null 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 a0779cd..7d08430 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionUpdate.kt @@ -12,10 +12,23 @@ import kotlinx.serialization.json.JsonElement /** * Input specification for a command. * - * [hint] All text that was typed after the command name is provided as input. + * Specifies how the agent should collect input for this command. */ @Serializable -public data class AvailableCommandInput(val hint: String) +@JsonClassDiscriminator("type") +public sealed class AvailableCommandInput { + /** + * All text typed after the command name is provided as unstructured input. + * + * @param hint A hint to display when input hasn't been provided yet + */ + @Serializable + @SerialName("unstructured") + public data class Unstructured( + val hint: String, + override val _meta: JsonElement? = null + ) : AvailableCommandInput(), AcpWithMeta +} /** * Information about a command. diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Terminal.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Terminal.kt index cf5417b..3dc7ade 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Terminal.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Terminal.kt @@ -7,9 +7,8 @@ import kotlinx.serialization.json.JsonElement /** * Terminal-related request and response types. - * - * **UNSTABLE**: These types are not part of the spec yet, - * and may be removed or changed at any point. + * + * See protocol docs: [Terminal](https://agentclientprotocol.com/protocol/terminal) */ /** diff --git a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/ToolCall.kt b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/ToolCall.kt index 9b51bd1..5b2a9c4 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/ToolCall.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/ToolCall.kt @@ -95,6 +95,7 @@ public sealed class ToolCallContent { @Serializable @SerialName("terminal") public data class Terminal( - val terminalId: String - ) : ToolCallContent() + val terminalId: String, + override val _meta: JsonElement? = null + ) : ToolCallContent(), AcpWithMeta } \ No newline at end of file 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 4525d8c..6d74cb5 100644 --- a/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt +++ b/acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/Types.kt @@ -2,7 +2,7 @@ package com.agentclientprotocol.model -import kotlinx.serialization.ExperimentalSerializationApi +import com.agentclientprotocol.annotations.UnstableApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement @@ -81,6 +81,7 @@ public value class SessionModeId(public val value: String) { * * A unique identifier for a model. */ +@UnstableApi @JvmInline @Serializable public value class ModelId(public val value: String) { @@ -96,6 +97,19 @@ public enum class Role { @SerialName("user") USER } +/** + * Describes the name and version of an ACP implementation. + * + * Used by both clients and agents to identify themselves during initialization. + */ +@Serializable +public data class Implementation( + val name: String, + val version: String, + val title: String? = null, + override val _meta: JsonElement? = null +) : AcpWithMeta + /** * Optional annotations for the client. The client can use annotations to inform how objects are used or displayed. */ diff --git a/acp/api/acp.api b/acp/api/acp.api index 8e48abd..63ffec5 100644 --- a/acp/api/acp.api +++ b/acp/api/acp.api @@ -9,10 +9,11 @@ public final class com/agentclientprotocol/agent/Agent { public final class com/agentclientprotocol/agent/AgentInfo { public fun ()V - public fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILcom/agentclientprotocol/model/AgentCapabilities;Ljava/util/List;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAuthMethods ()Ljava/util/List; public final fun getCapabilities ()Lcom/agentclientprotocol/model/AgentCapabilities; + public final fun getImplementation ()Lcom/agentclientprotocol/model/Implementation; public final fun getProtocolVersion ()I public final fun get_meta ()Lkotlinx/serialization/json/JsonElement; } @@ -78,9 +79,10 @@ public final class com/agentclientprotocol/client/Client { public final class com/agentclientprotocol/client/ClientInfo { public fun ()V - public fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;)V - public synthetic fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;)V + public synthetic fun (ILcom/agentclientprotocol/model/ClientCapabilities;Lcom/agentclientprotocol/model/Implementation;Lkotlinx/serialization/json/JsonElement;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getCapabilities ()Lcom/agentclientprotocol/model/ClientCapabilities; + public final fun getImplementation ()Lcom/agentclientprotocol/model/Implementation; public final fun getProtocolVersion ()I public final fun get_meta ()Lkotlinx/serialization/json/JsonElement; } diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt index cc27067..3a33082 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/Agent.kt @@ -120,12 +120,12 @@ public class Agent( private fun setHandlers(protocol: Protocol) { // Set up request handlers for incoming client requests protocol.setRequestHandler(AcpMethod.AgentMethods.Initialize) { params: InitializeRequest -> - val clientInfo = ClientInfo(params.protocolVersion, params.clientCapabilities, params._meta) + val clientInfo = ClientInfo(params.protocolVersion, params.clientCapabilities, params.clientInfo, params._meta) _clientInfo.complete(clientInfo) val agentInfo = agentSupport.initialize(clientInfo) // see https://agentclientprotocol.com/protocol/initialization#version-negotiation val negotiatedVersion = min(params.protocolVersion, agentInfo.protocolVersion) - return@setRequestHandler InitializeResponse(negotiatedVersion, agentInfo.capabilities, agentInfo.authMethods, agentInfo._meta) + return@setRequestHandler InitializeResponse(negotiatedVersion, agentInfo.capabilities, agentInfo.authMethods, agentInfo.implementation, agentInfo._meta) } protocol.setRequestHandler(AcpMethod.AgentMethods.Authenticate) { params: AuthenticateRequest -> diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentInfo.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentInfo.kt index ea4e5af..92ef361 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentInfo.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentInfo.kt @@ -2,6 +2,7 @@ package com.agentclientprotocol.agent import com.agentclientprotocol.model.AgentCapabilities import com.agentclientprotocol.model.AuthMethod +import com.agentclientprotocol.model.Implementation import com.agentclientprotocol.model.LATEST_PROTOCOL_VERSION import com.agentclientprotocol.model.ProtocolVersion import kotlinx.serialization.json.JsonElement @@ -10,5 +11,6 @@ public class AgentInfo( public val protocolVersion: ProtocolVersion = LATEST_PROTOCOL_VERSION, public val capabilities: AgentCapabilities = AgentCapabilities(), public val authMethods: List = emptyList(), + public val implementation: Implementation? = null, public val _meta: JsonElement? = null ) \ No newline at end of file diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentSession.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentSession.kt index e92cd70..a29f258 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentSession.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/agent/AgentSession.kt @@ -1,5 +1,6 @@ package com.agentclientprotocol.agent +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.common.Event import com.agentclientprotocol.model.* import kotlinx.coroutines.flow.Flow @@ -45,23 +46,27 @@ public interface AgentSession { /** * Return a set of available models for the session. If the session doesn't support models, return an empty list. */ + @UnstableApi public val availableModels: List get() = emptyList() /** * Return the default model for the session. The method is called only if [availableModels] returns a non-empty list. */ + @UnstableApi public val defaultModel: ModelId get() = throw NotImplementedError("Must be implemented when providing non-empty ${::availableModels.name}") /** * Called when a client asks to change model. If the model is changed [SessionUpdate.CurrentModelUpdate] must be sent to the client. */ + @UnstableApi public suspend fun setModel(modelId: ModelId, _meta: JsonElement?): SetSessionModelResponse { throw NotImplementedError("Must be implemented when providing non-empty ${::availableModels.name}") } } +@UnstableApi internal fun AgentSession.asModelState(): SessionModelState? { val models = availableModels if (models.isEmpty()) return null diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt index a38f87f..0841b58 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/Client.kt @@ -138,8 +138,8 @@ public class Client( public suspend fun initialize(clientInfo: ClientInfo, _meta: JsonElement? = null): AgentInfo { _clientInfo.complete(clientInfo) - val initializeResponse = AcpMethod.AgentMethods.Initialize(protocol, InitializeRequest(clientInfo.protocolVersion, clientInfo.capabilities, _meta)) - val agentInfo = AgentInfo(initializeResponse.protocolVersion, initializeResponse.agentCapabilities, initializeResponse.authMethods, initializeResponse._meta) + val initializeResponse = AcpMethod.AgentMethods.Initialize(protocol, InitializeRequest(clientInfo.protocolVersion, clientInfo.capabilities, clientInfo.implementation, _meta)) + val agentInfo = AgentInfo(initializeResponse.protocolVersion, initializeResponse.agentCapabilities, initializeResponse.authMethods, initializeResponse.agentInfo, initializeResponse._meta) _agentInfo.complete(agentInfo) return agentInfo } diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientInfo.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientInfo.kt index c4f31ac..1347a27 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientInfo.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientInfo.kt @@ -1,6 +1,7 @@ package com.agentclientprotocol.client import com.agentclientprotocol.model.ClientCapabilities +import com.agentclientprotocol.model.Implementation import com.agentclientprotocol.model.LATEST_PROTOCOL_VERSION import com.agentclientprotocol.model.ProtocolVersion import kotlinx.serialization.json.JsonElement @@ -8,5 +9,6 @@ import kotlinx.serialization.json.JsonElement public class ClientInfo( public val protocolVersion: ProtocolVersion = LATEST_PROTOCOL_VERSION, public val capabilities: ClientCapabilities = ClientCapabilities(), + public val implementation: Implementation? = null, public val _meta: JsonElement? = null ) \ No newline at end of file diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSession.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSession.kt index 26737b3..0c2564e 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSession.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSession.kt @@ -1,5 +1,6 @@ package com.agentclientprotocol.client +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.common.ClientSessionOperations import com.agentclientprotocol.common.Event import com.agentclientprotocol.common.SessionCreationParameters @@ -53,11 +54,13 @@ public interface ClientSession { /** * The flag indicates whether the agent supports the session model changing. */ + @UnstableApi public val modelsSupported: Boolean /** * Returns a list of available models. Returns an empty list if the model changing is not supported. */ + @UnstableApi public val availableModels: List /** @@ -65,10 +68,12 @@ public interface ClientSession { * * @throws IllegalStateException if the model changing is not supported. */ + @UnstableApi public val currentModel: StateFlow /** * Changes the session model to the specified model. The real change will be reported by an agent via [currentModel] and [ClientSessionOperations.notify]. */ + @UnstableApi public suspend fun setModel(modelId: ModelId, _meta: JsonElement? = null): SetSessionModelResponse } \ No newline at end of file diff --git a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt index cd3f268..bd2135e 100644 --- a/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt +++ b/acp/src/commonMain/kotlin/com/agentclientprotocol/client/ClientSessionImpl.kt @@ -1,5 +1,6 @@ package com.agentclientprotocol.client +import com.agentclientprotocol.annotations.UnstableApi import com.agentclientprotocol.common.ClientSessionOperations import com.agentclientprotocol.common.Event import com.agentclientprotocol.common.SessionCreationParameters @@ -41,6 +42,7 @@ internal class ClientSessionImpl( MutableStateFlow(modes.currentModeId) } + @UnstableApi private val _currentModel by lazy { val models = createdResponse.models ?: error("Models are not provided by the agent") MutableStateFlow(models.currentModelId) @@ -98,15 +100,19 @@ internal class ClientSessionImpl( return AcpMethod.AgentMethods.SessionSetMode(protocol, SetSessionModeRequest(sessionId, modeId, _meta)) } + @UnstableApi override val modelsSupported: Boolean get() = createdResponse.models != null + @UnstableApi override val availableModels: List get() = createdResponse.models?.availableModels ?: emptyList() + @UnstableApi override val currentModel: StateFlow get() = _currentModel + @UnstableApi override suspend fun setModel(modelId: ModelId, _meta: JsonElement?): SetSessionModelResponse { return AcpMethod.AgentMethods.SessionSetModel(protocol, SetSessionModelRequest(sessionId, modelId, _meta)) } diff --git a/build.gradle.kts b/build.gradle.kts index fe09ff3..7086053 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.7.3" +private val baseVersion = "0.8.0" allprojects { group = "com.agentclientprotocol"