///|
/// Client Info — sent during initialization
pub(all) struct ClientInfo {
  name : String
  title : String?
  version : String
} derive(Debug, Eq)

///|
/// Client Capabilities — declared during initialization
pub(all) struct ClientCapabilities {
  experimental : Map[String, Json]?
  roots : RootCapabilities?
  sampling : SamplingCapabilities?
  elicitation : ElicitationCapabilities?
  extra_fields : Map[String, Json]
  /// Optional protocol extensions, per 2026-07-28 versioning: a map of
  /// extension identifiers (following `_meta` key naming rules) to
  /// per-extension settings objects.
  extensions : Map[String, Json]?
} derive(Debug, Eq)

///|
/// Root Capabilities — client can provide filesystem roots
pub(all) struct RootCapabilities {
  list_changed : Bool?
  extra_fields : Map[String, Json]
} derive(Debug, Eq)

///|
/// Sampling Capabilities — client supports LLM sampling requests
pub(all) struct SamplingCapabilities {
  context : Map[String, Json]?
  tools : Map[String, Json]?
  extra_fields : Map[String, Json]
} derive(Debug, Eq)

///|
/// Elicitation Capabilities — client supports user interaction requests
pub(all) struct ElicitationCapabilities {
  form : Map[String, Json]?
  url : Map[String, Json]?
  extra_fields : Map[String, Json]
} derive(Debug, Eq)

///|
/// Root — a filesystem root exposed by the client for `roots/list`
pub(all) struct Root {
  uri : String
  name : String?
} derive(Debug, Eq)

///|
/// SamplingMessage — a message within a sampling/createMessage request
pub(all) struct SamplingMessage {
  role : Role
  content : SamplingContent
  meta : Map[String, Json]?
  extensions : Map[String, Json]
} derive(Debug, Eq)

///|
/// CreateMessageRequest — server asks client to sample an LLM.
/// `max_tokens` keeps the exact integer literal (pinned schema: `integer`);
/// `temperature` keeps the exact decimal literal (pinned schema: `number`).
pub(all) struct CreateMessageRequest {
  messages : Array[SamplingMessage]
  max_tokens : JsonInteger
  model_preferences : ModelPreferences?
  system_prompt : String?
  include_context : SamplingContext?
  temperature : JsonNumber?
  stop_sequences : Array[String]?
  metadata : Map[String, Json]?
  tools : Array[ToolDefinition]?
  tool_choice : ToolChoice?
  extensions : Map[String, Json]
} derive(Debug, Eq)

///|
/// CreateMessageResult — client's response to a sampling request
pub(all) struct CreateMessageResult {
  role : Role
  model : String
  content : SamplingContent
  stop_reason : String?
  meta : Map[String, Json]?
  extensions : Map[String, Json]
} derive(Debug, Eq)

///|
/// ElicitationRequest — server asks client to interact with the user
pub(all) enum ElicitationRequest {
  Form(
    String,
    requested_schema~ : Json,
    explicit_mode~ : Bool,
    meta~ : Map[String, Json]?,
    extensions~ : Map[String, Json]
  )
  Url(
    String,
    url~ : String,
    elicitation_id~ : String?,
    meta~ : Map[String, Json]?,
    extensions~ : Map[String, Json]
  )
} derive(Debug, Eq)

///|
/// ElicitationResult — client's response to an elicitation request
pub(all) struct ElicitationResult {
  action : ElicitationAction
  content : Map[String, ElicitationValue]?
  extensions : Map[String, Json]
} derive(Debug, Eq)

///|
/// ProgressNotification — params for `notifications/progress`.
/// Counters keep exact decimal literals (pinned schema: `number`).
pub(all) struct ProgressNotification {
  progress_token : ProgressToken
  progress : JsonNumber
  total : JsonNumber?
  message : String?
  extra_fields : Map[String, Json]
} derive(Debug, Eq)

///|
/// CancelledNotification — params for `notifications/cancelled`
pub(all) struct CancelledNotification {
  request_id : RequestId
  reason : String?
} derive(Debug, Eq)

///|
/// ResourceUpdatedNotification — params for `notifications/resources/updated`
pub(all) struct ResourceUpdatedNotification {
  uri : String
} derive(Debug, Eq)

///|
/// Explicit trait method promotion for current MoonBit toolchains.
pub extend ClientInfo with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ClientInfo with Eq::{not_equal, equal}

///|
pub extend ClientCapabilities with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ClientCapabilities with Eq::{not_equal, equal}

///|
pub extend RootCapabilities with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend RootCapabilities with Eq::{not_equal, equal}

///|
pub extend SamplingCapabilities with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend SamplingCapabilities with Eq::{not_equal, equal}

///|
pub extend ElicitationCapabilities with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ElicitationCapabilities with Eq::{not_equal, equal}

///|
pub extend Root with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend Root with Eq::{not_equal, equal}

///|
pub extend SamplingMessage with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend SamplingMessage with Eq::{not_equal, equal}

///|
pub extend CreateMessageRequest with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend CreateMessageRequest with Eq::{not_equal, equal}

///|
pub extend CreateMessageResult with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend CreateMessageResult with Eq::{not_equal, equal}

///|
pub extend ElicitationRequest with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ElicitationRequest with Eq::{not_equal, equal}

///|
pub extend ElicitationResult with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ElicitationResult with Eq::{not_equal, equal}

///|
pub extend ProgressNotification with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend ProgressNotification with Eq::{not_equal, equal}

///|
pub extend CancelledNotification with @moonbitlang/core/debug.Debug::{to_repr}

///|
pub extend CancelledNotification with Eq::{not_equal, equal}

///|
pub extend ResourceUpdatedNotification with @moonbitlang/core/debug.Debug::{
  to_repr,
}

///|
pub extend ResourceUpdatedNotification with Eq::{not_equal, equal}