sig
  type json = Data.json
  type kind = [ `EXEC | `GET | `SET ]
  module type Input =
    sig
      type t
      val jtype : Package.jtype
      val of_json : Request.json -> Request.Input.t
    end
  module type Output =
    sig
      type t
      val jtype : Package.jtype
      val to_json : Request.Output.t -> Request.json
    end
  type 'a input = (module Request.Input with type t = 'a)
  type 'b output = (module Request.Output with type t = 'b)
  type signal
  val signal :
    package:Package.package ->
    name:string -> descr:Markdown.text -> Request.signal
  val emit : Request.signal -> unit
  val on_signal : Request.signal -> (bool -> unit) -> unit
  val register :
    package:Package.package ->
    kind:Request.kind ->
    name:string ->
    descr:Markdown.text ->
    input:'Request.input -> output:'Request.output -> ('-> 'b) -> unit
  type ('a, 'b) signature
  val signature :
    ?input:'Request.input ->
    ?output:'Request.output -> unit -> ('a, 'b) Request.signature
  type rq
  type 'a param = Request.rq -> 'a
  type 'b result = Request.rq -> '-> unit
  val register_sig :
    package:Package.package ->
    kind:Request.kind ->
    name:string ->
    descr:Markdown.text ->
    ('a, 'b) Request.signature -> (Request.rq -> '-> 'b) -> unit
  val param :
    (unit, 'b) Request.signature ->
    name:string ->
    descr:Markdown.text ->
    ?default:'-> 'Request.input -> 'Request.param
  val param_opt :
    (unit, 'b) Request.signature ->
    name:string ->
    descr:Markdown.text -> 'Request.input -> 'a option Request.param
  val result :
    ('a, unit) Request.signature ->
    name:string ->
    descr:Markdown.text ->
    ?default:'-> 'Request.output -> 'Request.result
  val result_opt :
    ('a, unit) Request.signature ->
    name:string ->
    descr:Markdown.text -> 'Request.output -> 'b option Request.result
  val dictionary :
    package:Package.package ->
    name:string ->
    descr:Markdown.text ->
    'Data.Enum.dictionary -> (module Data.S with type t = 'a)
end