sig
  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 Connection_with_menu :
    sig
      type t = Versioned_rpc.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 Caller_converts :
    sig
      module Rpc :
        sig
          module type S =
            sig
              type query
              type response
              val deprecated_dispatch_multi :
                version:int ->
                Rpc.Connection.t ->
                query -> response Core.Std.Or_error.t Import.Deferred.t
              val dispatch_multi :
                Connection_with_menu.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 deprecated_dispatch_multi :
                  version:int ->
                  Rpc.Connection.t ->
                  Model.query ->
                  Model.response Core.Std.Or_error.t Import.Deferred.t
                val dispatch_multi :
                  Connection_with_menu.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 deprecated_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 dispatch_multi :
                Connection_with_menu.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 deprecated_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 dispatch_multi :
                  Connection_with_menu.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 Both_convert :
    sig
      module Plain :
        sig
          module type S =
            sig
              type caller_query
              type caller_response
              type callee_query
              type callee_response
              val dispatch_multi :
                Connection_with_menu.t ->
                caller_query ->
                caller_response Core.Std.Or_error.t Import.Deferred.t
              val implement_multi :
                ?log_not_previously_seen_version:(name:string -> int -> unit) ->
                ('state -> callee_query -> callee_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
                         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
end