From fd3a8583b848c3ccadfd66c7b187e3aa86a5152d Mon Sep 17 00:00:00 2001 From: Pavel Gorgulov Date: Fri, 20 Mar 2026 18:07:32 +0100 Subject: [PATCH] feat: add tasks models (#566) ## Motivation and Context closes #421 #406 ## How Has This Been Tested? Unit tests ## Breaking Changes NaN ## Types of changes - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [x] I have added appropriate error handling - [x] I have added or updated documentation as needed --- kotlin-sdk-core/api/kotlin-sdk-core.api | 564 ++++++++++++ .../kotlin/sdk/types/methods.kt | 5 + .../kotlin/sdk/types/notification.kt | 45 + .../kotlin/sdk/types/request.kt | 12 + .../kotlin/sdk/types/serializers.kt | 17 + .../kotlin/sdk/types/tasks.kt | 347 ++++++++ .../kotlin/sdk/types/NotificationTest.kt | 112 +++ .../kotlin/sdk/types/TasksTest.kt | 802 ++++++++++++++++++ 8 files changed, 1904 insertions(+) create mode 100644 kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tasks.kt create mode 100644 kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/TasksTest.kt diff --git a/kotlin-sdk-core/api/kotlin-sdk-core.api b/kotlin-sdk-core/api/kotlin-sdk-core.api index dc3da3e..7e1b98c 100644 --- a/kotlin-sdk-core/api/kotlin-sdk-core.api +++ b/kotlin-sdk-core/api/kotlin-sdk-core.api @@ -848,6 +848,67 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/CallToolResult$Compa public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest;Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CancelTaskRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/CancelledNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotification$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/CancelledNotificationParams;)V @@ -1403,6 +1464,37 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/CreateMessageResult$ public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Task;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/Task;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/Task; + public final fun component2 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/Task;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult;Lio/modelcontextprotocol/kotlin/sdk/types/Task;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public final fun getTask ()Lio/modelcontextprotocol/kotlin/sdk/types/Task; + public fun get_meta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/CreateTaskResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/CustomNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/CustomNotification$Companion; public fun (Lio/modelcontextprotocol/kotlin/sdk/types/Method;Lio/modelcontextprotocol/kotlin/sdk/types/BaseNotificationParams;)V @@ -1798,6 +1890,206 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/GetPromptResult$Comp public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult$Companion; + public static final synthetic fun box-impl (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult; + public static fun constructor-impl (Lkotlinx/serialization/json/JsonObject;)Lkotlinx/serialization/json/JsonObject; + public fun equals (Ljava/lang/Object;)Z + public static fun equals-impl (Lkotlinx/serialization/json/JsonObject;Ljava/lang/Object;)Z + public static final fun equals-impl0 (Lkotlinx/serialization/json/JsonObject;Lkotlinx/serialization/json/JsonObject;)Z + public static final fun get-impl (Lkotlinx/serialization/json/JsonObject;Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; + public final fun getJson ()Lkotlinx/serialization/json/JsonObject; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public static fun getMeta-impl (Lkotlinx/serialization/json/JsonObject;)Lkotlinx/serialization/json/JsonObject; + public fun get_meta ()Lkotlinx/serialization/json/JsonObject; + public static fun get_meta-impl (Lkotlinx/serialization/json/JsonObject;)Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public static fun hashCode-impl (Lkotlinx/serialization/json/JsonObject;)I + public fun toString ()Ljava/lang/String; + public static fun toString-impl (Lkotlinx/serialization/json/JsonObject;)Ljava/lang/String; + public final synthetic fun unbox-impl ()Lkotlinx/serialization/json/JsonObject; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; + public final fun deserialize-iveUaak (Lkotlinx/serialization/encoding/Decoder;)Lkotlinx/serialization/json/JsonObject; + public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public final fun serialize-kradpfw (Lkotlinx/serialization/encoding/Encoder;Lkotlinx/serialization/json/JsonObject;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskPayloadResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest$Companion; + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest; + public fun equals (Ljava/lang/Object;)Z + public final fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams : io/modelcontextprotocol/kotlin/sdk/types/RequestParams { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams$Companion; + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public synthetic fun (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun copy-D-90kyg (Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams; + public static synthetic fun copy-D-90kyg$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskRequestParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult, io/modelcontextprotocol/kotlin/sdk/types/TaskFields { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Long; + public final fun component7 ()Ljava/lang/Long; + public final fun component8 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult; + public fun equals (Ljava/lang/Object;)Z + public fun getCreatedAt ()Ljava/lang/String; + public fun getLastUpdatedAt ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getPollInterval ()Ljava/lang/Long; + public fun getStatus ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public fun getStatusMessage ()Ljava/lang/String; + public fun getTaskId ()Ljava/lang/String; + public fun getTtl ()Ljava/lang/Long; + public fun get_meta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/GetTaskResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/GetTaskResult;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/GetTaskResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/Icon { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Companion; public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/modelcontextprotocol/kotlin/sdk/types/Icon$Theme;)V @@ -2548,6 +2840,72 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ListRootsResult$Comp public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest, io/modelcontextprotocol/kotlin/sdk/types/ServerRequest { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest;Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest; + public fun equals (Ljava/lang/Object;)Z + public fun getCursor ()Ljava/lang/String; + public fun getMeta-VI-3G7E ()Lkotlinx/serialization/json/JsonObject; + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/PaginatedRequestParams; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/RequestParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListTasksRequest$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListTasksResult : io/modelcontextprotocol/kotlin/sdk/types/ClientResult, io/modelcontextprotocol/kotlin/sdk/types/PaginatedResult, io/modelcontextprotocol/kotlin/sdk/types/ServerResult { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult$Companion; + public fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/List; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult;Ljava/util/List;Ljava/lang/String;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult; + public fun equals (Ljava/lang/Object;)Z + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getNextCursor ()Ljava/lang/String; + public final fun getTasks ()Ljava/util/List; + public fun get_meta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/ListTasksResult$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/ListTasksResult;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/ListTasksResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest : io/modelcontextprotocol/kotlin/sdk/types/ClientRequest, io/modelcontextprotocol/kotlin/sdk/types/PaginatedRequest { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/ListToolsRequest$Companion; public fun ()V @@ -2797,6 +3155,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Defined : jav public static final field NotificationsResourcesListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field NotificationsResourcesUpdated Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field NotificationsRootsListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field NotificationsTasksStatus Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field NotificationsToolsListChanged Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field Ping Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field PromptsGet Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; @@ -2808,6 +3167,10 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/Method$Defined : jav public static final field ResourcesUnsubscribe Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field RootsList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field SamplingCreateMessage Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field TasksCancel Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field TasksGet Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field TasksList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; + public static final field TasksResult Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field ToolsCall Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static final field ToolsList Lio/modelcontextprotocol/kotlin/sdk/types/Method$Defined; public static fun getEntries ()Lkotlin/enums/EnumEntries; @@ -3439,6 +3802,33 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/ReferenceType$Compan public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata$Companion; + public fun (Ljava/lang/String;)V + public final fun component1 ()Ljava/lang/String; + public final fun copy (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata;Ljava/lang/String;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata; + public fun equals (Ljava/lang/Object;)Z + public final fun getTaskId ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/Request { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Request$Companion; public abstract fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; @@ -3534,6 +3924,7 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/RequestMeta { public static final fun get-impl (Lkotlinx/serialization/json/JsonObject;Ljava/lang/String;)Lkotlinx/serialization/json/JsonElement; public final fun getJson ()Lkotlinx/serialization/json/JsonObject; public static final fun getProgressToken-impl (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/RequestId; + public static final fun getRelatedTask-impl (Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/RelatedTaskMetadata; public fun hashCode ()I public static fun hashCode-impl (Lkotlinx/serialization/json/JsonObject;)I public fun toString ()Ljava/lang/String; @@ -4337,6 +4728,175 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/SubscribeRequestPara public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/Task : io/modelcontextprotocol/kotlin/sdk/types/TaskFields { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/Task$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Long; + public final fun component7 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;)Lio/modelcontextprotocol/kotlin/sdk/types/Task; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/Task;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/Task; + public fun equals (Ljava/lang/Object;)Z + public fun getCreatedAt ()Ljava/lang/String; + public fun getLastUpdatedAt ()Ljava/lang/String; + public fun getPollInterval ()Ljava/lang/Long; + public fun getStatus ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public fun getStatusMessage ()Ljava/lang/String; + public fun getTaskId ()Ljava/lang/String; + public fun getTtl ()Ljava/lang/Long; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/Task$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/Task$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/Task; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/Task;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/Task$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public abstract interface class io/modelcontextprotocol/kotlin/sdk/types/TaskFields { + public abstract fun getCreatedAt ()Ljava/lang/String; + public abstract fun getLastUpdatedAt ()Ljava/lang/String; + public abstract fun getPollInterval ()Ljava/lang/Long; + public abstract fun getStatus ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public abstract fun getStatusMessage ()Ljava/lang/String; + public abstract fun getTaskId ()Ljava/lang/String; + public abstract fun getTtl ()Ljava/lang/Long; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskMetadata { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata$Companion; + public fun ()V + public fun (Ljava/lang/Long;)V + public synthetic fun (Ljava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/Long; + public final fun copy (Ljava/lang/Long;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;Ljava/lang/Long;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + public fun equals (Ljava/lang/Object;)Z + public final fun getTtl ()Ljava/lang/Long; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TaskMetadata$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/TaskMetadata;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskMetadata$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatus : java/lang/Enum { + public static final field Cancelled Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus$Companion; + public static final field Completed Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static final field Failed Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static final field InputRequired Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static final field Working Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public static fun values ()[Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatus$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification : io/modelcontextprotocol/kotlin/sdk/types/ClientNotification, io/modelcontextprotocol/kotlin/sdk/types/ServerNotification { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification$Companion; + public fun ()V + public fun (Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;)V + public synthetic fun (Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams; + public final fun copy (Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification; + public fun equals (Ljava/lang/Object;)Z + public fun getMethod ()Lio/modelcontextprotocol/kotlin/sdk/types/Method; + public synthetic fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/NotificationParams; + public fun getParams ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotification$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams : io/modelcontextprotocol/kotlin/sdk/types/NotificationParams, io/modelcontextprotocol/kotlin/sdk/types/TaskFields { + public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams$Companion; + public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;)V + public synthetic fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public final fun component3 ()Ljava/lang/String; + public final fun component4 ()Ljava/lang/String; + public final fun component5 ()Ljava/lang/String; + public final fun component6 ()Ljava/lang/Long; + public final fun component7 ()Ljava/lang/Long; + public final fun component8 ()Lkotlinx/serialization/json/JsonObject; + public final fun copy (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams; + public static synthetic fun copy$default (Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Lkotlinx/serialization/json/JsonObject;ILjava/lang/Object;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams; + public fun equals (Ljava/lang/Object;)Z + public fun getCreatedAt ()Ljava/lang/String; + public fun getLastUpdatedAt ()Ljava/lang/String; + public fun getMeta ()Lkotlinx/serialization/json/JsonObject; + public fun getPollInterval ()Ljava/lang/Long; + public fun getStatus ()Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatus; + public fun getStatusMessage ()Ljava/lang/String; + public fun getTaskId ()Ljava/lang/String; + public fun getTtl ()Ljava/lang/Long; + public fun get_meta ()Lkotlinx/serialization/json/JsonObject; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final synthetic class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams$$serializer : kotlinx/serialization/internal/GeneratedSerializer { + public static final field INSTANCE Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams$$serializer; + public final fun childSerializers ()[Lkotlinx/serialization/KSerializer; + public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams; + 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;Lio/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams;)V + public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V + public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; +} + +public final class io/modelcontextprotocol/kotlin/sdk/types/TaskStatusNotificationParams$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/TaskSupport : java/lang/Enum { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TaskSupport$Companion; public static final field Forbidden Lio/modelcontextprotocol/kotlin/sdk/types/TaskSupport; @@ -4351,6 +4911,10 @@ public final class io/modelcontextprotocol/kotlin/sdk/types/TaskSupport$Companio public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class io/modelcontextprotocol/kotlin/sdk/types/TasksKt { + public static final field RELATED_TASK_META_KEY Ljava/lang/String; +} + public final class io/modelcontextprotocol/kotlin/sdk/types/TextContent : io/modelcontextprotocol/kotlin/sdk/types/MediaContent { public static final field Companion Lio/modelcontextprotocol/kotlin/sdk/types/TextContent$Companion; public fun (Ljava/lang/String;Lio/modelcontextprotocol/kotlin/sdk/types/Annotations;Lkotlinx/serialization/json/JsonObject;)V diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt index 9970015..1d96fea 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/methods.kt @@ -32,6 +32,7 @@ public sealed interface Method { NotificationsToolsListChanged("notifications/tools/list_changed"), NotificationsRootsListChanged("notifications/roots/list_changed"), NotificationsPromptsListChanged("notifications/prompts/list_changed"), + NotificationsTasksStatus("notifications/tasks/status"), ToolsList("tools/list"), ToolsCall("tools/call"), LoggingSetLevel("logging/setLevel"), @@ -39,6 +40,10 @@ public sealed interface Method { CompletionComplete("completion/complete"), RootsList("roots/list"), ElicitationCreate("elicitation/create"), + TasksGet("tasks/get"), + TasksResult("tasks/result"), + TasksList("tasks/list"), + TasksCancel("tasks/cancel"), } /** diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt index 8eb4e4b..cb1aa99 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/notification.kt @@ -348,3 +348,48 @@ public data class ToolListChangedNotification(override val params: BaseNotificat @EncodeDefault override val method: Method = Method.Defined.NotificationsToolsListChanged } + +// ============================================================================ +// Task Status Notification +// ============================================================================ + +/** + * An optional notification from the receiver to the requestor, informing them that a task’s status has changed. + * Receivers are not required to send these notifications. + * + * This notification can be sent by either side (both [ClientNotification] and [ServerNotification]). + * + * @property params The task status notification parameters containing the current task state. + */ +@Serializable +public data class TaskStatusNotification(override val params: TaskStatusNotificationParams? = null) : + ClientNotification, + ServerNotification { + @EncodeDefault + override val method: Method = Method.Defined.NotificationsTasksStatus +} + +/** + * Parameters for a notifications/tasks/status notification. + * + * @property taskId The task identifier. + * @property status Current task state. + * @property statusMessage Optional human-readable message describing the current task state. + * @property createdAt ISO 8601 timestamp when the task was created. + * @property lastUpdatedAt ISO 8601 timestamp when the task was last updated. + * @property ttl Actual retention duration from creation in milliseconds, null for unlimited. + * @property pollInterval Suggested polling interval in milliseconds. + * @property meta Optional metadata for this notification. + */ +@Serializable +public data class TaskStatusNotificationParams( + override val taskId: String, + override val status: TaskStatus, + override val statusMessage: String? = null, + override val createdAt: String, + override val lastUpdatedAt: String, + override val ttl: Long?, + override val pollInterval: Long? = null, + @SerialName("_meta") override val meta: JsonObject? = null, +) : NotificationParams, + TaskFields diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt index 699dfce..dc7bd3b 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/request.kt @@ -6,6 +6,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.long import kotlinx.serialization.json.longOrNull import kotlin.jvm.JvmInline @@ -22,6 +23,17 @@ public value class RequestMeta(public val json: JsonObject) { } } + /** + * The related task metadata, if this request is associated with a task. + * + * @see RelatedTaskMetadata + * @see RELATED_TASK_META_KEY + */ + public val relatedTask: RelatedTaskMetadata? + get() = json[RELATED_TASK_META_KEY]?.let { element -> + McpJson.decodeFromJsonElement(element) + } + /** * Retrieves the value associated with the specified key from the JSON object. * diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt index 4d5974d..2d20d42 100644 --- a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/serializers.kt @@ -159,6 +159,10 @@ private val clientRequestDeserializers: Map CreateMessageResult.serializer() "roots" in jsonObject -> ListRootsResult.serializer() "action" in jsonObject -> ElicitResult.serializer() + "task" in jsonObject -> CreateTaskResult.serializer() + "tasks" in jsonObject -> ListTasksResult.serializer() + "taskId" in jsonObject -> GetTaskResult.serializer() else -> null } } @@ -309,6 +322,7 @@ private fun selectClientResultDeserializer(element: JsonElement): Deserializatio * Selects the appropriate deserializer for server results based on JSON content. * Returns null if the structure doesn't match any known server result type. */ +@Suppress("CyclomaticComplexMethod") private fun selectServerResultDeserializer(element: JsonElement): DeserializationStrategy? { val jsonObject = element.jsonObject return when { @@ -321,6 +335,9 @@ private fun selectServerResultDeserializer(element: JsonElement): Deserializatio "messages" in jsonObject -> GetPromptResult.serializer() "contents" in jsonObject -> ReadResourceResult.serializer() "content" in jsonObject -> CallToolResult.serializer() + "task" in jsonObject -> CreateTaskResult.serializer() + "tasks" in jsonObject -> ListTasksResult.serializer() + "taskId" in jsonObject -> GetTaskResult.serializer() else -> null } } diff --git a/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tasks.kt b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tasks.kt new file mode 100644 index 0000000..42b5752 --- /dev/null +++ b/kotlin-sdk-core/src/commonMain/kotlin/io/modelcontextprotocol/kotlin/sdk/types/tasks.kt @@ -0,0 +1,347 @@ +@file:OptIn(ExperimentalSerializationApi::class) + +package io.modelcontextprotocol.kotlin.sdk.types + +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import kotlin.jvm.JvmInline + +/** + * The key used in `_meta` to associate a message with a task. + */ +public const val RELATED_TASK_META_KEY: String = "io.modelcontextprotocol/related-task" + +/** + * Common fields shared by all types representing the task state. + */ +public sealed interface TaskFields { + public val taskId: String + public val status: TaskStatus + public val statusMessage: String? + public val createdAt: String + public val lastUpdatedAt: String + public val ttl: Long? + public val pollInterval: Long? +} + +/** + * Data associated with a task. + * + * @property taskId The task identifier. + * @property status Current task state. + * @property statusMessage Optional human-readable message describing the current task state. + * This can provide context for any status, including reasons for "cancelled" status, + * summaries for "completed" status, or diagnostic information for "failed" status. + * @property createdAt ISO 8601 timestamp when the task was created. + * @property lastUpdatedAt ISO 8601 timestamp when the task was last updated. + * @property ttl Actual retention duration from creation in milliseconds, null for unlimited. + * @property pollInterval Suggested polling interval in milliseconds. + */ +@Serializable +public data class Task( + override val taskId: String, + override val status: TaskStatus, + override val statusMessage: String? = null, + override val createdAt: String, + override val lastUpdatedAt: String, + override val ttl: Long?, + override val pollInterval: Long? = null, +) : TaskFields + +/** + * Metadata for augmenting a request with task execution. + * Include this in the `task` field of the request parameters. + * + * @property ttl Requested duration in milliseconds to retain task from creation. + */ +@Serializable +public data class TaskMetadata(val ttl: Long? = null) + +/** + * The status of a task. + */ +@Serializable +public enum class TaskStatus { + @SerialName("working") + Working, + + @SerialName("input_required") + InputRequired, + + @SerialName("completed") + Completed, + + @SerialName("failed") + Failed, + + @SerialName("cancelled") + Cancelled, +} + +/** + * Metadata for associating messages with a task. + * Include this in the `_meta` field under the key `io.modelcontextprotocol/related-task`. + * + * @property taskId The task identifier this message is associated with. + */ +@Serializable +public data class RelatedTaskMetadata(val taskId: String) + +/** + * A response to a task-augmented request. + * + * @property task The task data associated with the response. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class CreateTaskResult( + val task: Task, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult, + ServerResult + +// ============================================================================ +// tasks/get +// ============================================================================ + +/** + * A request to retrieve the state of a task. + * + * This request can be sent by either side (both [ClientRequest] and [ServerRequest]). + * + * @property params The parameters specifying which task to retrieve. + */ +@Serializable +public data class GetTaskRequest(override val params: GetTaskRequestParams) : + ClientRequest, + ServerRequest { + @EncodeDefault + override val method: Method = Method.Defined.TasksGet + + /** + * The task identifier to query. + */ + public val taskId: String + get() = params.taskId + + /** + * Metadata for this request. May include a progressToken for out-of-band progress notifications. + */ + public val meta: RequestMeta? + get() = params.meta +} + +/** + * Parameters for a tasks/get request. + * + * @property taskId The task identifier to query. + * @property meta Optional metadata for this request. + */ +@Serializable +public data class GetTaskRequestParams( + val taskId: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * The response to a tasks/get request. + * + * Contains all [Task] fields flattened into the result (intersection of Result and Task). + * + * @property taskId The task identifier. + * @property status Current task state. + * @property statusMessage Optional human-readable message describing the current task state. + * @property createdAt ISO 8601 timestamp when the task was created. + * @property lastUpdatedAt ISO 8601 timestamp when the task was last updated. + * @property ttl Actual retention duration from creation in milliseconds, null for unlimited. + * @property pollInterval Suggested polling interval in milliseconds. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class GetTaskResult( + override val taskId: String, + override val status: TaskStatus, + override val statusMessage: String? = null, + override val createdAt: String, + override val lastUpdatedAt: String, + override val ttl: Long?, + override val pollInterval: Long? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult, + ServerResult, + TaskFields + +// ============================================================================ +// tasks/result +// ============================================================================ + +/** + * A request to retrieve the result of a completed task. + * + * This request can be sent by either side (both [ClientRequest] and [ServerRequest]). + * + * @property params The parameters specifying which task to retrieve results for. + */ +@Serializable +public data class GetTaskPayloadRequest(override val params: GetTaskPayloadRequestParams) : + ClientRequest, + ServerRequest { + @EncodeDefault + override val method: Method = Method.Defined.TasksResult + + /** + * The task identifier to retrieve results for. + */ + public val taskId: String + get() = params.taskId + + /** + * Metadata for this request. May include a progressToken for out-of-band progress notifications. + */ + public val meta: RequestMeta? + get() = params.meta +} + +/** + * Parameters for a tasks/result request. + * + * @property taskId The task identifier to retrieve results for. + * @property meta Optional metadata for this request. + */ +@Serializable +public data class GetTaskPayloadRequestParams( + val taskId: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * The response to a tasks/result request. + * + * The structure matches the result type of the original request. + * For example, a tools/call task would return the [CallToolResult] structure. + * + * @property meta Optional metadata for this response. + */ +@JvmInline +@Serializable +public value class GetTaskPayloadResult(public val json: JsonObject) : + ClientResult, + ServerResult { + override val meta: JsonObject? + get() = json["_meta"]?.takeIf { it is JsonObject } as? JsonObject + + /** + * Retrieves the value associated with the specified key from the result payload. + * + * @param key the key whose corresponding value is to be returned + * @return the [JsonElement] associated with the specified key, or null if the key does not exist + */ + public operator fun get(key: String): JsonElement? = json[key] +} + +// ============================================================================ +// tasks/list +// ============================================================================ + +/** + * A request to retrieve a list of tasks. + * + * This request can be sent by either side (both [ClientRequest] and [ServerRequest]). + * Supports pagination through the cursor parameter. + * + * @property params Optional pagination parameters to control which page of results to return. + */ +@Serializable +public data class ListTasksRequest(override val params: PaginatedRequestParams? = null) : + ClientRequest, + ServerRequest, + PaginatedRequest { + @EncodeDefault + override val method: Method = Method.Defined.TasksList +} + +/** + * The response to a tasks/list request. + * + * @property tasks The list of tasks. + * @property nextCursor An opaque token representing the pagination position after the last returned result. + * If present, there may be more results available. + * @property meta Optional metadata for this response. + */ +@Serializable +public data class ListTasksResult( + val tasks: List, + override val nextCursor: String? = null, + @SerialName("_meta") + override val meta: JsonObject? = null, +) : ClientResult, + ServerResult, + PaginatedResult + +// ============================================================================ +// tasks/cancel +// ============================================================================ + +/** + * A request to cancel a task. + * + * This request can be sent by either side (both [ClientRequest] and [ServerRequest]). + * + * @property params The parameters specifying which task to cancel. + */ +@Serializable +public data class CancelTaskRequest(override val params: CancelTaskRequestParams) : + ClientRequest, + ServerRequest { + @EncodeDefault + override val method: Method = Method.Defined.TasksCancel + + /** + * The task identifier to cancel. + */ + public val taskId: String + get() = params.taskId + + /** + * Metadata for this request. May include a progressToken for out-of-band progress notifications. + */ + public val meta: RequestMeta? + get() = params.meta +} + +/** + * Parameters for a tasks/cancel request. + * + * @property taskId The task identifier to cancel. + * @property meta Optional metadata for this request. + */ +@Serializable +public data class CancelTaskRequestParams( + val taskId: String, + @SerialName("_meta") + override val meta: RequestMeta? = null, +) : RequestParams + +/** + * The response to a tasks/cancel request. + * + * Contains all [Task] fields flattened into the result (intersection of Result and Task). + * + * @property taskId The task identifier. + * @property status Current task state. + * @property statusMessage Optional human-readable message describing the current task state. + * @property createdAt ISO 8601 timestamp when the task was created. + * @property lastUpdatedAt ISO 8601 timestamp when the task was last updated. + * @property ttl Actual retention duration from creation in milliseconds, null for unlimited. + * @property pollInterval Suggested polling interval in milliseconds. + * @property meta Optional metadata for this response. + */ +public typealias CancelTaskResult = GetTaskResult diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt index b55a441..01c6b87 100644 --- a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/NotificationTest.kt @@ -310,4 +310,116 @@ class NotificationTest { """.trimIndent(), ) } + + @Test + fun `should serialize TaskStatusNotification with all fields`() { + val notification = TaskStatusNotification( + TaskStatusNotificationParams( + taskId = "task-1", + status = TaskStatus.Working, + statusMessage = "Processing data", + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:01:00Z", + ttl = 60000, + pollInterval = 5000, + meta = buildJsonObject { put("source", "worker-1") }, + ), + ) + + verifySerialization( + notification, + McpJson, + """ + { + "method": "notifications/tasks/status", + "params": { + "taskId": "task-1", + "status": "working", + "statusMessage": "Processing data", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:01:00Z", + "ttl": 60000, + "pollInterval": 5000, + "_meta": { + "source": "worker-1" + } + } + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize TaskStatusNotification with minimal fields`() { + val notification = TaskStatusNotification( + TaskStatusNotificationParams( + taskId = "task-2", + status = TaskStatus.Completed, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:02:00Z", + ttl = null, + ), + ) + + verifySerialization( + notification, + McpJson, + """ + { + "method": "notifications/tasks/status", + "params": { + "taskId": "task-2", + "status": "completed", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:02:00Z" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize TaskStatusNotification`() { + val json = """ + { + "method": "notifications/tasks/status", + "params": { + "taskId": "task-3", + "status": "failed", + "statusMessage": "Connection lost", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:03:00Z", + "ttl": 30000, + "pollInterval": 1000 + } + } + """.trimIndent() + + val notification = verifyDeserialization(McpJson, json) + val params = notification.params!! + + assertEquals(Method.Defined.NotificationsTasksStatus, notification.method) + assertEquals("task-3", params.taskId) + assertEquals(TaskStatus.Failed, params.status) + assertEquals("Connection lost", params.statusMessage) + assertEquals("2025-01-01T00:00:00Z", params.createdAt) + assertEquals("2025-01-01T00:03:00Z", params.lastUpdatedAt) + assertEquals(30000L, params.ttl) + assertEquals(1000L, params.pollInterval) + assertNull(params.meta) + } + + @Test + fun `should deserialize TaskStatusNotification without params`() { + val json = """ + { + "method": "notifications/tasks/status" + } + """.trimIndent() + + val notification = verifyDeserialization(McpJson, json) + + assertEquals(Method.Defined.NotificationsTasksStatus, notification.method) + assertNull(notification.params) + } } diff --git a/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/TasksTest.kt b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/TasksTest.kt new file mode 100644 index 0000000..14bd248 --- /dev/null +++ b/kotlin-sdk-core/src/commonTest/kotlin/io/modelcontextprotocol/kotlin/sdk/types/TasksTest.kt @@ -0,0 +1,802 @@ +package io.modelcontextprotocol.kotlin.sdk.types + +import io.kotest.matchers.nulls.shouldBeNull +import io.kotest.matchers.nulls.shouldNotBeNull +import io.kotest.matchers.shouldBe +import io.kotest.matchers.types.shouldBeInstanceOf +import io.modelcontextprotocol.kotlin.test.utils.verifyDeserialization +import io.modelcontextprotocol.kotlin.test.utils.verifySerialization +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.jsonPrimitive +import kotlinx.serialization.json.put +import kotlin.test.Test + +class TasksTest { + + // ======================================================================== + // Task + // ======================================================================== + + @Test + fun `should serialize Task with minimal fields`() { + val task = Task( + taskId = "task-1", + status = TaskStatus.Working, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:00:00Z", + ttl = null, + ) + + verifySerialization( + task, + McpJson, + """ + { + "taskId": "task-1", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:00Z" + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize Task with all fields`() { + val task = Task( + taskId = "task-2", + status = TaskStatus.Completed, + statusMessage = "Processing complete", + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:01:00Z", + ttl = 60000, + pollInterval = 5000, + ) + + verifySerialization( + task, + McpJson, + """ + { + "taskId": "task-2", + "status": "completed", + "statusMessage": "Processing complete", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:01:00Z", + "ttl": 60000, + "pollInterval": 5000 + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize Task and verify TaskFields contract`() { + val json = """ + { + "taskId": "task-3", + "status": "failed", + "statusMessage": "Connection lost", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:02:00Z", + "ttl": 30000, + "pollInterval": 1000 + } + """.trimIndent() + + val task = verifyDeserialization(McpJson, json) + task.shouldBeInstanceOf() + task.taskId shouldBe "task-3" + task.status shouldBe TaskStatus.Failed + task.statusMessage shouldBe "Connection lost" + task.createdAt shouldBe "2025-01-01T00:00:00Z" + task.lastUpdatedAt shouldBe "2025-01-01T00:02:00Z" + task.ttl shouldBe 30000L + task.pollInterval shouldBe 1000L + } + + // ======================================================================== + // TaskStatus + // ======================================================================== + + @Test + fun `should serialize all TaskStatus values`() { + verifySerialization(TaskStatus.Working, McpJson, "\"working\"") + verifySerialization(TaskStatus.InputRequired, McpJson, "\"input_required\"") + verifySerialization(TaskStatus.Completed, McpJson, "\"completed\"") + verifySerialization(TaskStatus.Failed, McpJson, "\"failed\"") + verifySerialization(TaskStatus.Cancelled, McpJson, "\"cancelled\"") + } + + // ======================================================================== + // TaskMetadata + // ======================================================================== + + @Test + fun `should serialize TaskMetadata with ttl`() { + val metadata = TaskMetadata(ttl = 120000) + + verifySerialization( + metadata, + McpJson, + """ + { + "ttl": 120000 + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize TaskMetadata without ttl`() { + val metadata = TaskMetadata() + + verifySerialization( + metadata, + McpJson, + "{}", + ) + } + + // ======================================================================== + // RelatedTaskMetadata + // ======================================================================== + + @Test + fun `should serialize RelatedTaskMetadata`() { + val related = RelatedTaskMetadata(taskId = "task-42") + + verifySerialization( + related, + McpJson, + """ + { + "taskId": "task-42" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize RequestMeta with RelatedTaskMetadata`() { + val json = """ + { + "io.modelcontextprotocol/related-task": { + "taskId": "786512e2-9e0d-44bd-8f29-789f320fe840" + } + } + """.trimIndent() + + val meta = McpJson.decodeFromString(json) + val related = meta.relatedTask + related.shouldNotBeNull() + related.taskId shouldBe "786512e2-9e0d-44bd-8f29-789f320fe840" + } + + // ======================================================================== + // CreateTaskResult + // ======================================================================== + + @Test + fun `should serialize CreateTaskResult`() { + val result = CreateTaskResult( + task = Task( + taskId = "task-1", + status = TaskStatus.Working, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:00:00Z", + ttl = null, + ), + ) + + verifySerialization( + result, + McpJson, + """ + { + "task": { + "taskId": "task-1", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:00Z" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize CreateTaskResult with meta`() { + val result = CreateTaskResult( + task = Task( + taskId = "task-1", + status = TaskStatus.Working, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:00:00Z", + ttl = 60000, + ), + meta = buildJsonObject { put("trace", "abc") }, + ) + + verifySerialization( + result, + McpJson, + """ + { + "task": { + "taskId": "task-1", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:00Z", + "ttl": 60000 + }, + "_meta": { + "trace": "abc" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize CreateTaskResult`() { + val json = """ + { + "task": { + "taskId": "task-5", + "status": "input_required", + "statusMessage": "Need more data", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:01:00Z", + "pollInterval": 2000 + } + } + """.trimIndent() + + val result = verifyDeserialization(McpJson, json) + result.task.taskId shouldBe "task-5" + result.task.status shouldBe TaskStatus.InputRequired + result.task.statusMessage shouldBe "Need more data" + result.task.pollInterval shouldBe 2000L + result.task.ttl.shouldBeNull() + result.meta.shouldBeNull() + } + + // ======================================================================== + // GetTaskRequest + // ======================================================================== + + @Test + fun `should serialize GetTaskRequest`() { + val request = GetTaskRequest( + GetTaskRequestParams(taskId = "task-10"), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/get", + "params": { + "taskId": "task-10" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize GetTaskRequest with meta`() { + val request = GetTaskRequest( + GetTaskRequestParams( + taskId = "task-10", + meta = RequestMeta( + buildJsonObject { put("progressToken", "pt-1") }, + ), + ), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/get", + "params": { + "taskId": "task-10", + "_meta": { + "progressToken": "pt-1" + } + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize GetTaskRequest`() { + val json = """ + { + "method": "tasks/get", + "params": { + "taskId": "task-11" + } + } + """.trimIndent() + + val request = verifyDeserialization(McpJson, json) + request.method shouldBe Method.Defined.TasksGet + request.taskId shouldBe "task-11" + request.meta.shouldBeNull() + } + + // ======================================================================== + // GetTaskResult + // ======================================================================== + + @Test + fun `should serialize GetTaskResult with all fields`() { + val result = GetTaskResult( + taskId = "task-20", + status = TaskStatus.Completed, + statusMessage = "Done", + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:05:00Z", + ttl = 300000, + pollInterval = 10000, + meta = buildJsonObject { put("server", "main") }, + ) + + verifySerialization( + result, + McpJson, + """ + { + "taskId": "task-20", + "status": "completed", + "statusMessage": "Done", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:05:00Z", + "ttl": 300000, + "pollInterval": 10000, + "_meta": { + "server": "main" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize GetTaskResult and verify TaskFields contract`() { + val json = """ + { + "taskId": "task-21", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:30Z" + } + """.trimIndent() + + val result = verifyDeserialization(McpJson, json) + result.shouldBeInstanceOf() + result.taskId shouldBe "task-21" + result.status shouldBe TaskStatus.Working + result.statusMessage.shouldBeNull() + result.ttl.shouldBeNull() + result.pollInterval.shouldBeNull() + result.meta.shouldBeNull() + } + + // ======================================================================== + // GetTaskPayloadRequest + // ======================================================================== + + @Test + fun `should serialize GetTaskPayloadRequest`() { + val request = GetTaskPayloadRequest( + GetTaskPayloadRequestParams(taskId = "task-30"), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/result", + "params": { + "taskId": "task-30" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize GetTaskPayloadRequest`() { + val json = """ + { + "method": "tasks/result", + "params": { + "taskId": "task-31" + } + } + """.trimIndent() + + val request = verifyDeserialization(McpJson, json) + request.method shouldBe Method.Defined.TasksResult + request.taskId shouldBe "task-31" + request.meta.shouldBeNull() + } + + // ======================================================================== + // GetTaskPayloadResult + // ======================================================================== + + @Test + fun `should serialize GetTaskPayloadResult with meta`() { + val result = GetTaskPayloadResult( + buildJsonObject { + put("_meta", buildJsonObject { put("origin", "task-30") }) + }, + ) + + verifySerialization( + result, + McpJson, + """ + { + "_meta": { + "origin": "task-30" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize GetTaskPayloadResult without meta`() { + val result = GetTaskPayloadResult(buildJsonObject { }) + + verifySerialization(result, McpJson, "{}") + } + + @Test + fun `should preserve arbitrary payload fields in GetTaskPayloadResult`() { + val json = """ + { + "_meta": { + "origin": "task-42" + }, + "content": [ + { + "type": "text", + "text": "hello" + } + ], + "isError": false + } + """.trimIndent() + + val result = verifyDeserialization(McpJson, json) + result.meta.shouldNotBeNull() + result.meta?.get("origin")?.jsonPrimitive?.content shouldBe "task-42" + result["content"].shouldNotBeNull() + result["isError"].shouldNotBeNull() + } + + // ======================================================================== + // ListTasksRequest + // ======================================================================== + + @Test + fun `should serialize ListTasksRequest without params`() { + val request = ListTasksRequest() + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/list" + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize ListTasksRequest with cursor`() { + val request = ListTasksRequest( + params = PaginatedRequestParams(cursor = "page-2"), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/list", + "params": { + "cursor": "page-2" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize ListTasksRequest`() { + val json = """ + { + "method": "tasks/list", + "params": { + "cursor": "next-page" + } + } + """.trimIndent() + + val request = verifyDeserialization(McpJson, json) + request.method shouldBe Method.Defined.TasksList + request.cursor shouldBe "next-page" + } + + // ======================================================================== + // ListTasksResult + // ======================================================================== + + @Test + fun `should serialize ListTasksResult with empty list`() { + val result = ListTasksResult(tasks = emptyList()) + + verifySerialization( + result, + McpJson, + """ + { + "tasks": [] + } + """.trimIndent(), + ) + } + + @Test + fun `should serialize ListTasksResult with tasks and pagination`() { + val result = ListTasksResult( + tasks = listOf( + Task( + taskId = "task-1", + status = TaskStatus.Working, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:00:00Z", + ttl = null, + ), + Task( + taskId = "task-2", + status = TaskStatus.Completed, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:01:00Z", + ttl = 60000, + ), + ), + nextCursor = "cursor-abc", + ) + + verifySerialization( + result, + McpJson, + """ + { + "tasks": [ + { + "taskId": "task-1", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:00Z" + }, + { + "taskId": "task-2", + "status": "completed", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:01:00Z", + "ttl": 60000 + } + ], + "nextCursor": "cursor-abc" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize ListTasksResult`() { + val json = """ + { + "tasks": [ + { + "taskId": "task-99", + "status": "cancelled", + "statusMessage": "User cancelled", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:03:00Z" + } + ] + } + """.trimIndent() + + val result = verifyDeserialization(McpJson, json) + result.tasks.size shouldBe 1 + result.tasks[0].taskId shouldBe "task-99" + result.tasks[0].status shouldBe TaskStatus.Cancelled + result.tasks[0].statusMessage shouldBe "User cancelled" + result.tasks[0].ttl.shouldBeNull() + result.nextCursor.shouldBeNull() + } + + // ======================================================================== + // CancelTaskRequest + // ======================================================================== + + @Test + fun `should serialize CancelTaskRequest`() { + val request = CancelTaskRequest( + CancelTaskRequestParams(taskId = "task-40"), + ) + + verifySerialization( + request, + McpJson, + """ + { + "method": "tasks/cancel", + "params": { + "taskId": "task-40" + } + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize CancelTaskRequest`() { + val json = """ + { + "method": "tasks/cancel", + "params": { + "taskId": "task-41" + } + } + """.trimIndent() + + val request = verifyDeserialization(McpJson, json) + request.method shouldBe Method.Defined.TasksCancel + request.taskId shouldBe "task-41" + request.meta.shouldBeNull() + } + + // ======================================================================== + // CancelTaskResult + // ======================================================================== + + @Test + fun `should serialize CancelTaskResult`() { + val result = CancelTaskResult( + taskId = "task-40", + status = TaskStatus.Cancelled, + statusMessage = "Cancelled by user", + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:02:00Z", + ttl = null, + ) + + verifySerialization( + result, + McpJson, + """ + { + "taskId": "task-40", + "status": "cancelled", + "statusMessage": "Cancelled by user", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:02:00Z" + } + """.trimIndent(), + ) + } + + @Test + fun `should deserialize CancelTaskResult and verify TaskFields contract`() { + val json = """ + { + "taskId": "task-42", + "status": "cancelled", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:04:00Z", + "ttl": 120000, + "pollInterval": 3000 + } + """.trimIndent() + + val result = verifyDeserialization(McpJson, json) + result.shouldBeInstanceOf() + result.taskId shouldBe "task-42" + result.status shouldBe TaskStatus.Cancelled + result.statusMessage.shouldBeNull() + result.ttl shouldBe 120000L + result.pollInterval shouldBe 3000L + } + + // ======================================================================== + // Deserialization with unknown fields (ignoreUnknownKeys) + // ======================================================================== + + @Test + fun `should deserialize Task ignoring unknown fields`() { + val json = """ + { + "taskId": "task-100", + "status": "working", + "createdAt": "2025-01-01T00:00:00Z", + "lastUpdatedAt": "2025-01-01T00:00:00Z", + "unknownField": "should be ignored" + } + """.trimIndent() + + val task = McpJson.decodeFromString(json) + task.taskId shouldBe "task-100" + task.status shouldBe TaskStatus.Working + task.ttl.shouldBeNull() + } + + // ======================================================================== + // RequestMeta.relatedTask accessor + // ======================================================================== + + @Test + fun `should read relatedTask from RequestMeta`() { + val meta = RequestMeta( + buildJsonObject { + put( + RELATED_TASK_META_KEY, + buildJsonObject { put("taskId", "task-50") }, + ) + }, + ) + + val related = meta.relatedTask + related.shouldNotBeNull() + related.taskId shouldBe "task-50" + } + + @Test + fun `should return null relatedTask when key is absent`() { + val meta = RequestMeta( + buildJsonObject { put("progressToken", "pt-1") }, + ) + + meta.relatedTask.shouldBeNull() + } + + @Test + fun `GetTaskResult cast to CancelTaskResult via generic does not throw due to type erasure`() { + val result: RequestResult = GetTaskResult( + taskId = "task-1", + status = TaskStatus.Cancelled, + createdAt = "2025-01-01T00:00:00Z", + lastUpdatedAt = "2025-01-01T00:01:00Z", + ttl = null, + ) + + // Simulates what Protocol.request() does: + // the cast goes through a generic type parameter, so JVM erases T to RequestResult + fun uncheckedCast(value: RequestResult): T { + @Suppress("UNCHECKED_CAST") + return value as T + } + + val cancelResult: CancelTaskResult = uncheckedCast(result) + + cancelResult.taskId shouldBe "task-1" + cancelResult.status shouldBe TaskStatus.Cancelled + } +}