sig
  module Caller_converts :
    sig
      module Rpc :
        sig
          module type S =
            sig
              type query
              type response
              val dispatch_multi :
                version:int ->
                Rpc.Connection.t ->
                query -> response Core.Std.Or_error.t Import.Deferred.t
              val versions : unit -> Core.Std.Int.Set.t
            end
          module Make :
            functor
              (Model : sig val name : string type query type response end->
              sig
                module Register :
                  functor
                    (Version_i : sig
                                   val version : int
                                   type query
                                   type response
                                   val query_of_model : Model.query -> query
                                   val model_of_response :
                                     response -> Model.response
                                   val bin_query :
                                     query Core.Std.Bin_prot.Type_class.t
                                   val bin_read_query :
                                     query Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_query__ :
                                     (int -> query)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_query :
                                     query Core.Std.Bin_prot.Size.sizer
                                   val bin_write_query :
                                     query Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_response :
                                     response Core.Std.Bin_prot.Type_class.t
                                   val bin_read_response :
                                     response
                                     Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_response__ :
                                     (int -> response)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_response :
                                     response Core.Std.Bin_prot.Size.sizer
                                   val bin_write_response :
                                     response
                                     Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.writer
                                 end->
                    sig
                      val rpc :
                        (Version_i.query, Version_i.response) Rpc.Rpc.t
                    end
                val dispatch_multi :
                  version:int ->
                  Rpc.Connection.t ->
                  Model.query ->
                  Model.response Core.Std.Or_error.t Import.Deferred.t
                val versions : unit -> Core.Std.Int.Set.t
              end
        end
      module Pipe_rpc :
        sig
          module type S =
            sig
              type query
              type response
              type error
              val dispatch_multi :
                version:int ->
                Rpc.Connection.t ->
                query ->
                (response Core.Std.Or_error.t Import.Pipe.Reader.t *
                 Rpc.Pipe_rpc.Id.t, error)
                Core.Std.Result.t Core.Std.Or_error.t Import.Deferred.t
              val versions : unit -> Core.Std.Int.Set.t
            end
          module Make :
            functor
              (Model : sig
                         val name : string
                         type query
                         type response
                         type error
                       end->
              sig
                module Register :
                  functor
                    (Version_i : sig
                                   val version : int
                                   type query
                                   type response
                                   type error
                                   val query_of_model : Model.query -> query
                                   val model_of_response :
                                     response -> Model.response
                                   val model_of_error : error -> Model.error
                                   val bin_query :
                                     query Core.Std.Bin_prot.Type_class.t
                                   val bin_read_query :
                                     query Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_query__ :
                                     (int -> query)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_query :
                                     query Core.Std.Bin_prot.Size.sizer
                                   val bin_write_query :
                                     query Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_response :
                                     response Core.Std.Bin_prot.Type_class.t
                                   val bin_read_response :
                                     response
                                     Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_response__ :
                                     (int -> response)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_response :
                                     response Core.Std.Bin_prot.Size.sizer
                                   val bin_write_response :
                                     response
                                     Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_error :
                                     error Core.Std.Bin_prot.Type_class.t
                                   val bin_read_error :
                                     error Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_error_ :
                                     error
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_error__ :
                                     (int -> error)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_error :
                                     error
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_error :
                                     error Core.Std.Bin_prot.Size.sizer
                                   val bin_write_error :
                                     error Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_error_ :
                                     error
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_error :
                                     error
                                     Core.Std.Bin_prot.Type_class.writer
                                 end->
                    sig
                      val rpc :
                        (Version_i.query, Version_i.response,
                         Version_i.error)
                        Rpc.Pipe_rpc.t
                    end
                val dispatch_multi :
                  version:int ->
                  Rpc.Connection.t ->
                  Model.query ->
                  (Model.response Core.Std.Or_error.t Import.Pipe.Reader.t *
                   Rpc.Pipe_rpc.Id.t, Model.error)
                  Core.Std.Result.t Core.Std.Or_error.t Import.Deferred.t
                val versions : unit -> Core.Std.Int.Set.t
              end
        end
    end
  module Callee_converts :
    sig
      module Rpc :
        sig
          module type S =
            sig
              type query
              type response
              val implement_multi :
                ?log_not_previously_seen_version:(name:string -> int -> unit) ->
                ('state -> query -> response Import.Deferred.t) ->
                'state Rpc.Implementation.t list
              val versions : unit -> Core.Std.Int.Set.t
            end
          module Make :
            functor
              (Model : sig val name : string type query type response end->
              sig
                module Register :
                  functor
                    (Version_i : sig
                                   val version : int
                                   type query
                                   type response
                                   val model_of_query : query -> Model.query
                                   val response_of_model :
                                     Model.response -> response
                                   val bin_query :
                                     query Core.Std.Bin_prot.Type_class.t
                                   val bin_read_query :
                                     query Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_query__ :
                                     (int -> query)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_query :
                                     query Core.Std.Bin_prot.Size.sizer
                                   val bin_write_query :
                                     query Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_response :
                                     response Core.Std.Bin_prot.Type_class.t
                                   val bin_read_response :
                                     response
                                     Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_response__ :
                                     (int -> response)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_response :
                                     response Core.Std.Bin_prot.Size.sizer
                                   val bin_write_response :
                                     response
                                     Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.writer
                                 end->
                    sig
                      val rpc :
                        (Version_i.query, Version_i.response) Rpc.Rpc.t
                    end
                val implement_multi :
                  ?log_not_previously_seen_version:(name:string ->
                                                    int -> unit) ->
                  ('state -> Model.query -> Model.response Import.Deferred.t) ->
                  'state Rpc.Implementation.t list
                val versions : unit -> Core.Std.Int.Set.t
              end
        end
      module Pipe_rpc :
        sig
          module type S =
            sig
              type query
              type response
              type error
              val implement_multi :
                ?log_not_previously_seen_version:(name:string -> int -> unit) ->
                ('state ->
                 query ->
                 aborted:unit Import.Deferred.t ->
                 (response Import.Pipe.Reader.t, error) Core.Std.Result.t
                 Import.Deferred.t) ->
                'state Rpc.Implementation.t list
              val versions : unit -> Core.Std.Int.Set.t
            end
          module Make :
            functor
              (Model : sig
                         val name : string
                         type query
                         type response
                         type error
                       end->
              sig
                module Register :
                  functor
                    (Version_i : sig
                                   val version : int
                                   type query
                                   type response
                                   type error
                                   val model_of_query : query -> Model.query
                                   val response_of_model :
                                     Model.response -> response
                                   val error_of_model : Model.error -> error
                                   val bin_query :
                                     query Core.Std.Bin_prot.Type_class.t
                                   val bin_read_query :
                                     query Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_query__ :
                                     (int -> query)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_query :
                                     query Core.Std.Bin_prot.Size.sizer
                                   val bin_write_query :
                                     query Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_query_ :
                                     query
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_query :
                                     query
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_response :
                                     response Core.Std.Bin_prot.Type_class.t
                                   val bin_read_response :
                                     response
                                     Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_response__ :
                                     (int -> response)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_response :
                                     response Core.Std.Bin_prot.Size.sizer
                                   val bin_write_response :
                                     response
                                     Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_response_ :
                                     response
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_response :
                                     response
                                     Core.Std.Bin_prot.Type_class.writer
                                   val bin_error :
                                     error Core.Std.Bin_prot.Type_class.t
                                   val bin_read_error :
                                     error Core.Std.Bin_prot.Read_ml.reader
                                   val bin_read_error_ :
                                     error
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_read_error__ :
                                     (int -> error)
                                     Core.Std.Bin_prot.Unsafe_read_c.reader
                                   val bin_reader_error :
                                     error
                                     Core.Std.Bin_prot.Type_class.reader
                                   val bin_size_error :
                                     error Core.Std.Bin_prot.Size.sizer
                                   val bin_write_error :
                                     error Core.Std.Bin_prot.Write_ml.writer
                                   val bin_write_error_ :
                                     error
                                     Core.Std.Bin_prot.Unsafe_write_c.writer
                                   val bin_writer_error :
                                     error
                                     Core.Std.Bin_prot.Type_class.writer
                                 end->
                    sig
                      val rpc :
                        (Version_i.query, Version_i.response,
                         Version_i.error)
                        Rpc.Pipe_rpc.t
                    end
                val implement_multi :
                  ?log_not_previously_seen_version:(name:string ->
                                                    int -> unit) ->
                  ('state ->
                   Model.query ->
                   aborted:unit Import.Deferred.t ->
                   (Model.response Import.Pipe.Reader.t, Model.error)
                   Core.Std.Result.t Import.Deferred.t) ->
                  'state Rpc.Implementation.t list
                val versions : unit -> Core.Std.Int.Set.t
              end
        end
    end
  module Menu :
    sig
      type t = Versioned_rpc.Menu.t
      val add : 'Rpc.Implementation.t list -> 'Rpc.Implementation.t list
      val request :
        Rpc.Connection.t -> t Core.Std.Or_error.t Import.Deferred.t
      val supported_rpcs : t -> Rpc.Implementation.Description.t list
      val supported_versions : t -> rpc_name:string -> Core.Std.Int.Set.t
    end
  module Both_convert :
    sig
      module Connection_with_menu :
        sig
          type t = Versioned_rpc.Both_convert.Connection_with_menu.t
          val create : Rpc.Connection.t -> t Import.Deferred.Or_error.t
          val connection : t -> Rpc.Connection.t
          val menu : t -> Menu.t
        end
      module Plain :
        functor
          (Model : sig
                     val name : string
                     module Caller : sig type query type response end
                     module Callee : sig type query type response end
                   end->
          sig
            module Register :
              functor
                (Version : sig
                             val version : int
                             type query
                             type response
                             val query_of_caller_model :
                               Model.Caller.query -> query
                             val callee_model_of_query :
                               query -> Model.Callee.query
                             val response_of_callee_model :
                               Model.Callee.response -> response
                             val caller_model_of_response :
                               response -> Model.Caller.response
                             val bin_query :
                               query Core.Std.Bin_prot.Type_class.t
                             val bin_read_query :
                               query Core.Std.Bin_prot.Read_ml.reader
                             val bin_read_query_ :
                               query Core.Std.Bin_prot.Unsafe_read_c.reader
                             val bin_read_query__ :
                               (int -> query)
                               Core.Std.Bin_prot.Unsafe_read_c.reader
                             val bin_reader_query :
                               query Core.Std.Bin_prot.Type_class.reader
                             val bin_size_query :
                               query Core.Std.Bin_prot.Size.sizer
                             val bin_write_query :
                               query Core.Std.Bin_prot.Write_ml.writer
                             val bin_write_query_ :
                               query Core.Std.Bin_prot.Unsafe_write_c.writer
                             val bin_writer_query :
                               query Core.Std.Bin_prot.Type_class.writer
                             val bin_response :
                               response Core.Std.Bin_prot.Type_class.t
                             val bin_read_response :
                               response Core.Std.Bin_prot.Read_ml.reader
                             val bin_read_response_ :
                               response
                               Core.Std.Bin_prot.Unsafe_read_c.reader
                             val bin_read_response__ :
                               (int -> response)
                               Core.Std.Bin_prot.Unsafe_read_c.reader
                             val bin_reader_response :
                               response Core.Std.Bin_prot.Type_class.reader
                             val bin_size_response :
                               response Core.Std.Bin_prot.Size.sizer
                             val bin_write_response :
                               response Core.Std.Bin_prot.Write_ml.writer
                             val bin_write_response_ :
                               response
                               Core.Std.Bin_prot.Unsafe_write_c.writer
                             val bin_writer_response :
                               response Core.Std.Bin_prot.Type_class.writer
                           end->
                sig  end
            val dispatch_multi :
              Connection_with_menu.t ->
              Model.Caller.query ->
              Model.Caller.response Core.Std.Or_error.t Import.Deferred.t
            val implement_multi :
              ?log_not_previously_seen_version:(name:string -> int -> unit) ->
              ('state ->
               Model.Callee.query -> Model.Callee.response Import.Deferred.t) ->
              'state Rpc.Implementation.t list
            val versions : unit -> Core.Std.Int.Set.t
          end
    end
end