sig
  module Server_status :
    sig
      type t = {
        time : float;
        read_only : bool;
        tls : [ `Native | `None | `OpenSSL ];
        preemptive_bounds : int * int;
        preemptive_queue : int;
        libev : bool;
        gc_minor_words : float;
        gc_promoted_words : float;
        gc_major_words : float;
        gc_minor_collections : int;
        gc_major_collections : int;
        gc_heap_words : int;
        gc_heap_chunks : int;
        gc_compactions : int;
        gc_top_heap_words : int;
        gc_stack_size : int;
      }
      val create :
        time:float ->
        read_only:bool ->
        tls:[ `Native | `None | `OpenSSL ] ->
        preemptive_bounds:int * int ->
        preemptive_queue:int ->
        libev:bool -> gc:Gc.stat -> Ketrew_pure.Protocol.Server_status.t
    end
  module Down_message :
    sig
      type t =
          [ `List_of_query_descriptions of (string * string) list
          | `List_of_target_flat_states of
              (string * Target.State.Flat.t) list
          | `List_of_target_ids of string list
          | `List_of_target_summaries of (string * Target.Summary.t) list
          | `List_of_targets of Target.t list
          | `Ok
          | `Query_error of string
          | `Query_result of string
          | `Server_status of Ketrew_pure.Protocol.Server_status.t ]
      val to_json : t -> Yojson.Safe.json
      val of_json_exn : Yojson.Safe.json -> t
      val serialize : t -> string
      val deserialize_exn : string -> t
    end
  module Up_message :
    sig
      type time_constraint =
          [ `All
          | `Created_after of float
          | `Not_finished_before of float
          | `Status_changed_since of float ]
      type string_predicate = [ `Equals of string | `Matches of string ]
      type filter =
          [ `And of Ketrew_pure.Protocol.Up_message.filter list
          | `False
          | `Has_tag of Ketrew_pure.Protocol.Up_message.string_predicate
          | `Id of Ketrew_pure.Protocol.Up_message.string_predicate
          | `Name of Ketrew_pure.Protocol.Up_message.string_predicate
          | `Not of Ketrew_pure.Protocol.Up_message.filter
          | `Or of Ketrew_pure.Protocol.Up_message.filter list
          | `Status of
              [ `Activated_by_user
              | `Dead_because_of_dependencies
              | `Killable
              | `Really_running
              | `Simple of Target.State.simple ]
          | `True ]
      type target_query = {
        time_constraint : Ketrew_pure.Protocol.Up_message.time_constraint;
        filter : Ketrew_pure.Protocol.Up_message.filter;
      }
      type query_option = [ `Block_if_empty_at_most of float ]
      type t =
          [ `Call_query of string * string
          | `Get_available_queries of string
          | `Get_server_status
          | `Get_target_flat_states of
              [ `All | `Since of float ] * string list *
              Ketrew_pure.Protocol.Up_message.query_option list
          | `Get_target_ids of
              Ketrew_pure.Protocol.Up_message.target_query *
              Ketrew_pure.Protocol.Up_message.query_option list
          | `Get_target_summaries of string list
          | `Get_targets of string list
          | `Kill_targets of string list
          | `Restart_targets of string list
          | `Submit_targets of Target.t list ]
      val to_json : t -> Yojson.Safe.json
      val of_json_exn : Yojson.Safe.json -> t
      val serialize : t -> string
      val deserialize_exn : string -> t
      val target_query_markup :
        Ketrew_pure.Protocol.Up_message.target_query ->
        Internal_pervasives.Display_markup.t
    end
end