sig
  type json = Data.json
  type kind = [ `EXEC | `GET | `SET ]
  module type Input =
    sig
      type t
      val syntax : Syntax.t
      val of_json : Request.json -> Request.Input.t
    end
  module type Output =
    sig
      type t
      val syntax : Syntax.t
      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 :
    page:Doc.page ->
    name:string ->
    descr:Markdown.text -> ?details:Markdown.block -> unit -> Request.signal
  val emit : Request.signal -> unit
  val on_signal : Request.signal -> (bool -> unit) -> unit
  val register :
    page:Doc.page ->
    kind:Request.kind ->
    name:string ->
    descr:Markdown.text ->
    ?details:Markdown.block ->
    input:'Request.input -> output:'Request.output -> ('-> 'b) -> unit
  type ('a, 'b) signature
  val signature :
    page:Doc.page ->
    kind:Request.kind ->
    name:string ->
    descr:Markdown.text ->
    ?details:Markdown.block ->
    ?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 :
    ('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 : 'Data.Enum.dictionary -> unit
end